perm filename BAS10.MAC[DKH,LCS] blob sn#140127 filedate 1975-01-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	
C00003 00003		TITLE	BAS10  -  BASIC COMPILER
C00032 00004	STDL:	CAMN	A,[ASCIZ .(.]
C00057 00005		MOVE	[FILNAM,,LSTNAM]		IF , WE HAVE LSTNAM
C00086 00006		TROA	F,GENFLG
C00101 ENDMK
C⊗;
	SUBTTL	INITIALIZATION				HOFFMAN 4/74

	IFNDEF FTDEBUG,<FTDEBUG==1>		;FOR DDT COMPATIBILITY
	IFNDEF FTLIST,<FTLIST==0>
	IF1,<IFN FTDEBUG,<PRINTX COMPILING DEBUG FEATURES>
	IFN FTLIST,<PRINTX UNABRIDGED LISTING SWITCH ON>>

	LOC 137
	XWD 201,62				;VERSION
	LOC 41
	PUSHJ	P,UUODIS
	RELOC

	Z=1					;DEFINE AC'S
	ST=2
	A=3
	BP=4
	X=5
	C=6
	CH=7
	JS=10
	S1=11
	S2=12
	S3=13
	T1=14
	T2=15
	F=16
	P=17
	SALL

	CR==15					;OCTAL CONSTANTS
	LF==12
	TAB==11
	ALT==33
	QUO==42

	ARRFLG==1			;FLAGS IN LH F
	COMFLG==2
	WNUMFL==4
	TTYFLG==10
	STREXP==20
	UNAROP==40
	INAC==100
	ACPSHD==200
	NOPUSH==400
	SNGSTR==2000
	FN1FLG==4000
	FNEVFL==10000
	INXFLG==20000
	EXTFLG==40000

	CCLENT==1			;FLAGS IN RH F
	DATFLG==2
	EOJFLG==4
	INTFLG==10
	ONEFLG==20
	LUPFLG==40
	PASS2F==100
	NOSORT==200
	ILTFLG==400
	IGTFLG==1000
	IEQFLG==2000
	NEGEXP==4000
	READFL==10000
	GENFLG==20000

	IFE FTDEBUG,<TWOSEG>

	OPDEF PUTCHR [1000,,0]
	OPDEF PUTSTR [2000,,0]
	OPDEF GOTO   [3000,,0]
	OPDEF FIX    [4000,,0]
	OPDEF FLOAT  [5000,,0]
	OPDEF OCTLFT [6000,,0]
	OPDEF OCTRT  [7000,,0]

	OPDEF JOVFL  [255440,,0]

	DEFINE SIXMOV (A),<JSP	JS,SIXADD	;TO TRANSFER FILENAMES
	POINT 6,A>

	DEFINE SETBP (A),<MOVEI	BP,A
	HRLI	BP,↑O440700>

	DEFINE WORT (A),<IRP A,<A:	Z>>	;TO GENERATE SINGLE WORDS

	DEFINE REMAC (A),<IRPC A, <MOVEI S2,"A"
	IDPB	S2,BP>				;TO COORDINATE WITH
	MOVEI	S2,"!"				; RUN UUO FOR "EX" AND
	IDPB	S2,BP				; "LOAD" COMMANDS
	MOVEI	S2,CR
	IDPB	S2,BP
	MOVEI	S2,LF
	IDPB	S2,BP>

	DEFINE DIE (A),<JRST [OUTSTR [ASCIZ/A/]
		EXIT]>				;MACRO TO BOMB OUT JOB

BUFA1:	Z					;HOMEMADE BUFFERS
	XWD 201,BUFA2+1
	BLOCK 201
BUFA2:	Z
	XWD 201,BUFA1+1
	BLOCK 201

BUFB1:	Z
	XWD 201,BUFB2+1
	BLOCK 201
BUFB2:	Z
	XWD 201,BUFB1+1
	BLOCK 201

	RADIX 10

	LINLEN==18				;WORDS PER SOURCE LINE
	LINBLK==1024/LINLEN			;LINES PER 1K CORE
	IFN FTDEBUG,<LINBLK==LINBLK*15>
	STKLEN==100
PDL:	BLOCK STKLEN				;PUSHDOWN LIST
	AUXLEN==100
AUXSTK:	BLOCK AUXLEN

	WORT	<DEV,DATPT,STEMP,STRCT,OLDPT,FILCNT>
VAR:	BLOCK 3
	WORT	<ISTATE,CURNUM,SCSNUM,CMSTPT,PDLTMP,ERRCNT,PTSTOR>
	WORT	<LSTDEV,MCBFPT,MCBFCT,DIM1,OLDCT,NEWCT,CHRCT,FNCCNT>
RBLOCK:	BLOCK 6

	SUBTTL	I/O CONSIDERATIONS			HOFFMAN 4/74
TMPNAM:	SIXBIT .000BS1.				;TEMPORARY FILE NAME
	SIXBIT .TMP.				; (FOR SORTED FILE)
	BLOCK 2

TM1:	SIXBIT .000BAS.				;CCL FILE
	SIXBIT .TMP.
	BLOCK 2

COMSTR:	BLOCK 75				;COMMAND STRING BUFFER
IBUF:	BLOCK 3					;BUFFERS
OBUF:	BLOCK 3
OBF:	BLOCK 3

OP0:	Z					;LOWSEG OPEN BLOCKS
SRCDEV:	SIXBIT .DSK.				; (MODIFIABLE DEVICES)
	EXP IBUF

OP1:	Z
OBJDEV:	SIXBIT .DSK.
	XWD OBUF,0

OP3:	Z
	SIXBIT .DSK.
	EXP IBUF

FILNAM:	BLOCK 4					;LOOKUP/ENTER BLOCKS
SRCNAM:	BLOCK 4
OBJNAM:	BLOCK 4
LSTNAM:	BLOCK 4

STRING:	BLOCK LINLEN
STRTMP:	BLOCK LINLEN
ACS:	BLOCK 8

MACBUF:	BLOCK 25				;FOR MACRO CCL FILE

MACTMP:	SIXBIT/MAC/
IWD:	BLOCK 2
ACLST:	ASCIZ/VAL/
	ASCIZ/.T1/
	ASCIZ/.T2/
	ASCIZ/.T3/
	ASCIZ/.T4/

	NUSRFN==26
USRFNC:	BLOCK NUSRFN

EOBOTH:						;END OF CORE FOR BOTH PASSES
VARS:	BLOCK 572				;SYMBOL TABLE SPACE
ASCNAM:	BLOCK 2					;ASCII NAME OF PROGRAM
FINX:	Z					;HIGHEST INSTRUCTION INDEX
	NMUARG==15
USRARG:	BLOCK NMUARG
PROG:	BLOCK LINLEN				;PRECAUTION FOR /N
DATARE:	BLOCK 40				;DATA AREA FOR /N
IFN FTDEBUG,<BLOCK LINLEN*LINBLK-40-LINLEN>	;SOURCE BUFFER SPACE

	IFE FTDEBUG,<RELOC EOBOTH>		;(PASS 1)
F
LPPOIN:	Z					;PASS 2 FOLLOWS
LPCOUN:	Z
LPSTAK:	BLOCK 15
TXTLIN:	BLOCK LINLEN

	IFE FTDEBUG,<RELOC ↑O400000>		;HIGH SEG BEGINS HERE

;
; 
;	AT THIS POINT THERE FOLLOW SEVERAL ROUTINES AND MACROS
;	TO BE WRITTEN INTO THE OBJECT CODE IF NECESSARY. THEY
;	ARE XLISTED SINCE THEIR ASCIZ EXPANSION WOULD TAKE UP
;	TOO MUCH SPACE.
; 
	IFE FTLIST,<XLIST>

	SUBTTL INITIAL FILE OUTPUT

BGNSTR:	ASCIZ/

	.T1=2
	.T2=3
	.T3=4
	.T4=5
	.X=6
	.X2=7
	ST=10
	BP=11
	DBP=12
	VAL=13
	RLC=14
	.L=15
	IO=16
	PP=17
	.JBFF==121

	LOC 41
	PUSHJ	PP,UUOHNL
	RELOC
	OPDEF FIX [4000,,0]
	OPDEF EXP [5000,,0]
	OPDEF EXPI [6000,,0]
	OPDEF IEXPI [7000,,0]
	OPDEF IEXP  [10000,,0]
	RCFAC=400012
	DEFINE RLOCA (A),<IRP A,<A=:RCFAC
	RCFAC=RCFAC+1>>
	RLOCA	<INITIA,SCANB,INSUB,CONCAT,IFSTR,GETCOR,PRCOM,PRTAB>
	RLOCA	<PCRLF,PRSTR,TFLOT,INPTB,UUOHNL,ERRNCF,ERRRD,EXPO>
	FORER.=:400010
	TYPER.=:FORER.

	RADIX 10
NEFGL:TEM1:	Z
STHFLG:	Z
INPFLG:	Z
RESTRT:	Z
LINCNT:	BLOCK 15
STRING:	BLOCK 15
INPTS:	BLOCK 15
IOWHER:	Z
PRSTAK:	BLOCK 13
CRLF:	BYTE (7) ↑O15,↑O12,0
GTSGTB:	SIXBIT	.SYS.
	SIXBIT	.BASHGH.
	BLOCK 6

TMP:	Z

/

	SUBTTL	MACRO FOR GENERATING LOOPS		HOFFMAN 4/74

REPEAT 0,<
LOOPMC:	ASCIZ/
LP1:	BLOCK 15
LP2:	BLOCK 15
LP3:	BLOCK 15

>
LOOPMC:	ASCIZ/
	DEFINE LOOP (A,B,%C,%D,%E),<
	MOVE	.T1,LP1(.L)
	FSB	.T1,LP3(.L)
	JRST	%C
F'B:	MOVEI	.L,B
	MOVE	.T1,A
%C:	MOVE	.T3,LP3(.L)
	FAD	.T1,.T3
	JUMPL	.T3,%D
	CAMLE	.T1,LP2(.L)
	JRST	E'B
	JRST	%E
%D:	CAMGE	.T1,LP2(.L)
	JRST	E'B
%E:	MOVEM	.T1,A
>
	DEFINE EOLOOP (B),<
	JRST	F'B
E'B:>
/

CHGTXT:	ASCIZ"	SKIPLE	.T4
	CAILE	.T4,75
	JRST	[OUTSTR	[ASCIZ .?CHANGE ERROR.]
	EXIT]
;@JBFF NOT EMPTY
	SETZM	@.JBFF
	PUSHJ	PP,GETCOR
	MOVE	.T1,1
	HRLI	.T1,↑O440700
	MOVEI	.X,1
	MOVE	.T3,"

	LIST

	SUBTTL	HISEG I/O AND MACRO DEFINITIONS		HOFFMAN 4/74

OP17:	↑O17					;HISEG (INALTERABLE)
	SIXBIT .DSK.				; OPEN BLOCKS
	Z

OP2:	Z
	SIXBIT .DSK.
	XWD OBF,0

TMP1:	SIXBIT/BAS/				;CCL FILE SPACE
	IOWD 75,COMSTR

RUNBLK:	SIXBIT/SYS/				;FOR NEXT PASS
	SIXBIT/MACRO/
	BLOCK 4

VALCOM:	ASCIZ/VAL,/
CRLF:	BYTE (7) CR,LF,0

	SUBTTL ERROR RECOVERY				HOFFMAN 4/74

	DEFINE	ERR(A,B),<
ERR'A:	MOVEI	T1,[ASCIZ/B/]
	JRST	ERROUT>

	ERR	MCP,MISSING CLOSING PARENTHESIS
	ERR	2OP,TWO CONSECUTIVE OPERATORS
	ERR	ILF,ILLEGAL FUNCTION CALL
	ERR	ILD,ILLEGAL DELIMITER
	ERR	BSF,BAD STRING FORMULA
	ERR	NFO,NOTHING FOLLOWING OPERATOR
	ERR	NUN,BAD UNARY OPERATOR
	ERR	NDT,NO DATA TO RESTORE
	ERR	GTE,GOTO OR THEN EXPECTED
	ERR	BFN,BAD FUNCTION NAME
	ERR	IFA,ILLEGAL FUNCTION ARGUMENT
	ERR	NIA,NON-INTEGER FOUND WHERE INTEGER WAS EXPECTED
	ERR	RNF,RELATION NOT FOUND WHERE EXPECTED
	ERR	IVS,INVALID SUBSCRIPT
	ERR	TLA,TOO MANY ARGUMENTS
	ERR	FDT,FUNCTION DEFINED TWICE
	ERR	INP,ERROR IN INPUT STATEMENT
	ERR	MSD,MISSING DELIMITER
	ERR	KNR,KEYWORD NOT RECOGNIZED
	ERR	ILP,ILLEGAL LOOP PARAMETER
	ERR	COM,COMPILER ERROR
	ERR	INL,ILLEGALLY NESTED LOOP
	ERR	FMT,ILLEGAL FORMAT
	ERR	END,END OF LINE NOT FOUND WHERE EXPECTED
	ERR	ILE,ILLEGAL EXPRESSION
	ERR	2UN,2 CONSECUTIVE UNARY OPERATORS
	ERR	UBP,UNBALANCED PARENTHESES
	ERR	OVF,OVERFLOW
	ERR	DIM,DIMENSIONING ERROR
;	ERR	NYI,FEATURE NOT YET IMPLEMENTED

	DEFINE	INSTR (A),<IRP A,<A'.:	ASCIZ/	A	/>>
	INSTR	<MOVE,MOVEI,MOVEM,LOOP,JUMP>

	SUBTTL	SOURCE SCANNER		HOFFMAN/PLAKUN/COURTNEY/LIPPINCOTT 3/74

	REPEAT 0,<

STATES FOR SOURCE SCANNER:

1=INTEGER	2=FLOATING PT	3=VARIABLE	[4=TEMPORARY FOR VAR]
5=STRING FUNC	6=OPERATOR	[7=OPEN QUOTE]	8=STRING CONSTANT
9=DELIMITER	10=STRING VAR	11=NUM FUNC	[12-14 TMP FLTPT STATES]
15=ARRAY VAR	16=STR ARR VAR	17=USRDEF FNC	18=USRDEF STRFNC
[19=TEMP FOR USRDEF FNCS]	[20-29 TEMPORARY KEYWORD + FUNC STATES]
30+ KEYWORDS (SEE BELOW)
DELIMS: ,;()=\<>'
>
	$INTEG==1
	$FLOAT==2
	$NUVAR==3
	$TMNVR==4
	$STFNC==5
	$OPERA==6
	$TMSTC==7
	$STCON==8
	$DELIM==9
	$STVAR==10
	$NUFNC==11
	$TMFL1==12
	$TMFL2==13
	$TMFL3==14
	$NUARR==15
	$STARR==16
	$UNUFN==17
	$USTFN==18
	$TMUSF==19

	$TWENT==20
	$TWNIN==29

	$BGNKY==30
	$INPUT==30
	$DATA==31
	$PRINT==32
	$FOR==33
	$DEF==34
	$REM==35
	$DIM==36
	$FILES==37
	$TOPS1==37
	$IF==38
	$LET==39
	$GOTO==40
	$NEXT==41
	$END==42
	$ON==43
	$STOP==44
	$TO==45
	$GOSUB==46
	$THEN==47
	$STEP==48
	$READ==49
	$CHANG==50
	$RETUR==51
	$RANDO==52
	$RESTO==53
	$SCRAT==54

	IFE FTLIST,<XLIST>
DELIM:	EXP ",",";","(",")","=","\","<",">","'","#",":"
	NUMDLM==.-DELIM
	DEFINE KEYMAC (A), <IRP A,<ASCII/A/
	Z>>
	DEFINE KEYG5 (A), <IRP A,<ASCII/A/>>
KEYWD:	KEYMAC	<INPUT,DATA,PRINT,FOR,DEF,REM,DIM,FILES,IF,LET>
	KEYMAC	<GOTO,NEXT,END,ON,STOP,TO,GOSUB,THEN,STEP,READ>
	KEYG5	<CHANGE,RETURN,RANDOM,RESTORE,SCRATCH>
	NUMKEY==.-KEYWD			;NUMBER OF KEYWORDS
	LIST

BASFNC:	KEYG5	<RND,SIN,COS,ABS,INT,EXP,LOG,SQR,SNH>
	KEYG5	<CSH,TNH,ATN>
BASONY:	KEYG5	<SGN,TAB,TAN,LEN>
	NUMBFN==.-BASFNC

F40FNC:	KEYMAC	<RAN,SIN,COS,ABS,AINT,EXP,ALOG,SQRT,SINH>
	KEYMAC	<COSH,TANH,ATAN>

STRFNC:	KEYG5	<CHR$>
	NUMSTF==.-STRFNC

SCAN:	MOVE	0,[C,,ACS]
	BLT	0,ACS+7
	SETZB	ST,STRING		;SET STATE TO 0
	SETZB	A,S1
	SETZ	S3,
	TDZ	F,[FN1FLG,,NEGEXP]
	MOVE	[STRING,,STRING+1]
	BLT	STRING+14
	MOVE	CH,[POINT 7,STRING]	;POINTER TO RESULTS
	MOVE	NEWCT
	EXCH	CHRCT
	MOVEM	OLDCT
	MOVEM	BP,OLDPT		;SAVE OLD POINTER

SCAN1:	JSP	JS,GETCHR		;GET A CHARACTER
	CAIL	C,"0"			;IS IT A DIGIT?
	CAILE	C,"9"
	JRST	NOTDGT			;NO

DIGIT:	CAIE	ST,$INTEG
	JUMPN	ST,NOT0			;YES. ARE WE IN STATE 0?
	MOVEI	ST,$INTEG		;YES. SET STATE TO 1
	MOVE	S2,C
	SUBI	S2,"0"
	IMULI	A,10			;BEGIN ACTUAL INTEGER
	ADDI	A,(S2)
	JOV	SCNERR
ONE:	IDPB	C,CH			;AND SAVE CHARACTER
	JRST	SCAN1			;RETURN FOR ANOTHER
NOT0:	CAIE	ST,$FLOAT
	JRST	NOTFLO
	MOVE	S2,C
	SUBI	S2,"0"
	SOJ	S3,
	FLOAT	S2,S2
	FMPRI	A,(10.0)
	FADR	A,S2
	JOV	SCNERR
	JRST	ONE
NOTFLO:	CAIE	ST,$TMFL1
	CAIN	ST,$TMFL2
	MOVEI	ST,$TMFL3
	CAIE	ST,$TMFL3
	JRST	NOTM3
	MOVE	S2,C
	SUBI	S2,"0"
	TRNE	F,NEGEXP
	MOVNS	S2
	IMULI	S1,10
	ADD	S1,S2
	JOV	SCNERR
	JRST	ONE
NOTM3:	CAIE	ST,$NUVAR		;ARE WE IN STATE 3?
	JRST	NOT3			;NO
	MOVEI	ST,$TMNVR		;AND GO INTO STATE 4
	JRST	ONE			;GET ANOTHER
NOT3:	CAILE	ST,$TWENT		;ARE WE IN STATE KEYWD?
	JRST	KEYVAR			;YES; SHOULDN'T BE
	JRST	EXT1			;OTHERWISE DONE

NOTDGT:	CAIN	ST,$TMFL2
	JRST	RTRN2
	CAIE	C,"$"			;OTHER POSSIBILITIES: $
	JRST	NOTDOL
	JUMPE	ST,ERRSCN
	CAIE	ST,$NUVAR		;LEGAL ONLY IN
	CAIN	ST,$TMNVR		;STATES 3 AND 4
	JRST	STRVA
	CAIE	ST,$UNUFN
	JRST	NOTT0
	MOVEI	ST,$USTFN
	JRST	EXT
STRVA:	IDPB	C,CH			;MARKS TERMINATION
	MOVEI	ST,$STVAR		;OF VARIABLE NAME.
	JRST	SCAN1
NOTDOL:	CAIN	ST,$UNUFN
	JRST	EXT1
	CAIL	C,"A"			;DO WE HAVE A LETTER
	CAILE	C,"Z"
	JRST	NOTLET			;NO
	JUMPN	ST,NOTT0		;YES; ARE WE IN STATE 0?
	MOVEI	ST,$NUVAR		;NO; GO INTO STATE 3
	CAIN	C,"F"
	TLO	F,FN1FLG
	JRST	ONE			;GET ANOTHER CHAR
NOTT0:	CAIE	C,"E"
	JRST	NOTTE
	CAIN	ST,$FLOAT
	JRST	ISFLOA
	CAIN	ST,$INTEG
	TLNE	F,WNUMFL
	SKIPA
	JRST	ISFLO1
NOTTE:	CAIN	ST,$TMFL1
	JRST	RTRN1
	CAIE	ST,$NUVAR
	JRST	NOTNVR
	MOVEI	ST,$TWENT
	CAIN	C,"N"
	TLNN	F,FN1FLG
	JRST	NOTNVR
	MOVEI	ST,$TMUSF
	JRST	ONE
NOTNVR:	CAIE	ST,$TMUSF
	JRST	NOTUSF
	MOVEI	ST,$UNUFN
	JRST	ONE
NOTUSF:	CAIGE	ST,$TWENT		;IF IN KEYWORD,
	JRST	EXT1
	CAIN	ST,$TWNIN		;TOO BIG FOR KEYWORD?
	JRST	KEYVAR
	AOJ	ST,
	IDPB	C,CH			;PUT AWAY CHAR
	MOVEI	S1,NUMKEY-2		;AND CHECK KEYWORD TABLE
	MOVE	S2,STRING
	MOVE	S3,STRING+1
KLP:	CAMN	S2,KEYWD(S1)		;FOR MATCH
	CAME	S3,KEYWD+1(S1)
	JRST	NOTHIS
	LSH	S1,-1			;GET KEYWD #
	MOVEI	ST,$BGNKY(S1)
	JRST	EXT			;GOT ONE
NOTHIS:	SUBI	S1,2
	JUMPGE	S1,KLP
	MOVNI	S1,NUMBFN
FNCLP:	CAMN	S2,BASFNC+NUMBFN(S1)
	JRST	FNCGOT
	AOJL	S1,FNCLP
	MOVNI	S1,NUMSTF
SFLP:	CAMN	S2,STRFNC+NUMSTF(S1)
	JRST	STFGOT
	AOJL	S1,SFLP
	JRST	SCAN1
FNCGOT:	MOVEI	ST,$NUFNC
	JRST	EXT
STFGOT:	MOVEI	ST,$STFNC
	JRST	EXT

ISFLO1:	MOVEI	"."
	IDPB	CH
	FLOAT	A,A
ISFLOA:	MOVE	[STRING,,STRTMP]
	BLT	STRTMP+14
	MOVEM	ST,STEMP
	MOVEI	ST,$TMFL1
	JRST	ONE

RTRN1:	IBP	BP
RTRN2:	REPEAT 2,<IBP	BP>
	SOJ	BP,
	MOVE	ST,STEMP
	MOVE	[STRTMP,,STRING]
	BLT	STRING+14
	JRST	EXT

NOTLET:	MOVEI	T1,NUMDLM		;WE MUST NEXT CHECK FOR DELIMITER
DLP:	CAMN	C,DELIM-1(T1)
	JRST	YESDEL			;GOT ONE
	SOJG	T1,DLP
	JRST	NOTDEL			;NO, IT ISN'T.
YESDEL:	CAIN	ST,$TMFL1
	JRST	RTRN1
	CAIN	C,"("
	JRST	SEARR
YDEL1:	JUMPN	ST,EXT1			;IF IN STATE 0, RETURN THE CHAR
	MOVEI	ST,$DELIM		;AND GO INTO STATE 9
	IDPB	C,CH
	JRST	EXT
SEARR:	CAIN	ST,$NUVAR
	JRST	YARR
	CAIN	ST,$TMNVR
	JRST	YARR
	CAIE	ST,$STVAR
	JRST	YDEL1
	MOVEI	ST,$STARR
	JRST	EXT1
YARR:	MOVEI	ST,$NUARR
	JRST	EXT1

NOTDEL:	CAIE	C,"+"			;DO WE HAVE AN OPERATOR?
	CAIN	C,"-"
	JRST	OPER1
	CAIN	ST,$TMFL1
	JRST	RTRN1
	CAIE	C,"*"
	CAIN	C,"/"
	JRST	OPER
	CAIE	C,"↑"
	JRST	NOTOPR

OPER:	JUMPN	ST,EXT1			;YES; IF IN STATE 0,
	MOVEI	ST,$OPERA		;GO INTO 6
	IDPB	C,CH			;AND RETURN THE OPERATOR
	CAIE	C,"*"
	JRST	EXT
	JSP	JS,GETCHR
	CAIE	C,"*"			;IS IT EXPONENTIATION?
	JRST	EXT1			;NO
	MOVEI	C,"↑"			;OTHERWISE, REPLACE WITH "↑"
	DPB	C,[POINT 7,STRING,6]		; IN C AND STRING
	JRST	EXT

OPER1:	CAIE	ST,$TMFL1
	JRST	OPER
	MOVEI	ST,$TMFL2
	CAIN	C,"-"
	TRO	F,NEGEXP
	JRST	ONE

NOTOPR:	CAIE	C,QUO			;DO WE HAVE A QUOTE?
	JRST	NOTQUO
	JUMPN	ST,EXT1			;IF WE HAD SOMETHING, WE'RE DONE
	MOVEI	ST,$TMSTC		;YES, GO INTO STATE 7
QLP:	JSP	JS,GETCHR		;AND KEEP GOING UNTIL
	CAIN	C,QUO			;WE GET ANOTHER QUOTE
	JRST	QUODON
	IDPB	C,CH
	JRST	QLP
QUODON:	MOVEI	ST,$STCON		;QUOTE DONE; GO INTO STATE 8
	JRST	EXT			;AND RETURN

NOTQUO:	CAIE	C,"."			;IS IT A PERIOD?
	JRST	ERRSCN			;IF NOT, IT'S NOT LEGAL
	CAILE	ST,$INTEG		;THIS IS ONLY GOOD IN STATE 1
	JRST	ERRSCN			;OR 0
	MOVEI	ST,$FLOAT		;IN WHICH CASE WE HAVE FLT PT
	FLOAT	A,A
	SETZ	S3,
	TRZ	F,NEGEXP
	JRST	ONE


GETCHR:	ILDB	C,BP			;SUBROUTINE TO GET ONE CHARACTER
	CAIE	C,CR			;AND SEE IF END OF LINE
	JRST	UPDCHR			;NO
	JUMPN	ST,NT00			;YES. ARE WE IN STATE 0?
	SETO	ST,			;IF SO, SET STATE -1 (END OF LINE)
	JRST	EXT			;AND EXIT
NT00:	CAIN	ST,$TMSTC		;STATES KEYWD AND 7
	JRST	ERRSCN
	CAIGE	ST,$TWENT
	JRST	EXT1
KEYVAR:	PUSHJ	P,STAKBK
KEYVR1:	ILDB	A,BP
	AOS	NEWCT
	CAIGE	A,QUO-1
	JRST	KEYVR1
	LSH	A,29
	MOVEM	A,STRING
	MOVEI	ST,$NUVAR
	JRST	LEAVE

UPDCHR:	AOS	T1,NEWCT
	CAIE	C,TAB
	JRST	NOTTAB
	AOJ	T1,
	IDIVI	T1,8
	JUMPN	T2,UPDCHR
NOTTAB:	CAIE	ST,$TMSTC
	CAIL	C,QUO-1
	SKIPA
	JRST	GETCHR
	JRST	(JS)

EXT1:	SOS	NEWCT
	SOJ	BP,			;OTHERWISE, WE ARE DONE.
	REPEAT 4,<IBP	BP>
EXT:	TLZ	F,WNUMFL
	CAIN	ST,$TMUSF
	JRST	ERRSCN
	CAIL	ST,$TWENT
	CAILE	ST,$TWNIN
	SKIPA
	JRST	KEYVAR
	CAIN	ST,$TMFL3
	MOVEI	ST,$FLOAT
	CAIE	ST,$FLOAT
	JRST	NOTFLT
	ADD	S1,S3
	JUMPE	S1,LEAVE
	JUMPL	S1,FLTDIV
	FMPRI	A,(10.0)
	SOJG	S1,.-1
	JRST	LEAVE
FLTDIV:	FDVRI	A,(10.0)
	AOJL	S1,.-1
	JRST	LEAVE
NOTFLT:	CAIN	ST,$TMNVR
	MOVEI	ST,$NUVAR
	CAIE	ST,$NUVAR
	CAIN	ST,$OPERA
	MOVE	A,STRING
	CAIE	ST,$DELIM
	CAIN	ST,$STVAR
	MOVE	A,STRING
	CAIE	ST,$NUARR
	CAIN	ST,$STARR
	MOVE	A,STRING
	CAIE	ST,$UNUFN
	CAIN	ST,$USTFN
	MOVE	A,STRING
	CAIN	ST,$STFNC
	MOVE	A,STRING
;	TEMP
	CAIN	ST,$NUFNC
	MOVE	A,STRING
;TEMP

LEAVE:	MOVE	0,[ACS,,C]
	BLT	0,T2
	POPJ	P,

ERRSCN:	MOVNI	ST,2
	JRST	LEAVE

	SUBTTL EXPRESSION EVALUATOR			DINGER 7/74

;OPERATION CODES:
UNSUB==0
ADDD==1
SUBB==2
MULL==3
DIVV==4
EXPP==5
CNCT0==6
CNCT1==7
CNCTL==8
FNCARG==9
FNCC==10
ARSUB1==11
ARSUB2==12
PUSH1==13
POP1==14

STEVAL:	TLOA	F,STREXP
EVALI:	TROA	F,INTFLG
EVAL:	TRZ	F,INTFLG
	SETZM	FNCCNT
	MOVE	JS,[IOWD AUXLEN,AUXSTK]
	PUSH	JS,P
	PUSHJ	JS,EXPREV
	POP	JS,0
	HRRZS	0
	HRRZ	Z,P
	SUB	0,Z
	MOVN	C,0
STKLP:	POP	P,Z
	PUSH	JS,Z
	AOJL	0,STKLP
	PUSHJ	P,CODGEN
	TLZ	F,STREXP
	POPJ	P,

EXPREV:	PUSHJ	P,SCAN
	JUMPL	ST,ERRILE
	CAIE	ST,$DELIM
	JRST	EXPRE0
	CAME	A,[ASCIZ .(.]
	JRST ERRILE
EXPRE0:	PUSHJ	P,STAKBK
	TLNE	F,STREXP
	JRST	STEXEV
EXPRE1:	TLZ	F,UNAROP
	PUSHJ	JS,GTITM
	PUSHJ	JS,GTOP
	POPJ	JS,

GTITM:	PUSHJ	P,SCAN
	GOTO TAB7

UNARY:	CAME	A,[ASCIZ/+/]
	CAMN	A,[ASCIZ/-/]
	SKIPA
	JRST	ERRNUN
	PUSH	JS,A
	TLOE	F,UNAROP
	JRST ERR2UN
	PUSHJ	JS,GTITM
	POP	JS,A
	CAMN	A,[ASCIZ/+/]
	POPJ	JS,
	SETZ
	MOVEI	ST,$OPERA
	PUSH	P,ST
	PUSH	P,0
	TLZ	F,UNAROP
	POPJ	JS,

CONST:	PUSH	P,ST
	PUSH	P,A
	POPJ	JS,

DLRCRS:	CAME	A,[ASCIZ .(.]
	JRST	ERRNFO
RCRS:	PUSHJ	JS,EXPREV
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .).]
	POPJ	JS,
	JRST	ERRUBP

FUNC:	PUSH	P,ST
	PUSH	P,A
	PUSH	JS,F
	PUSH	JS,FNCCNT
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .(.]
	JRST	FUNCLP
	PUSHJ	P,STAKBK
	JRST	FUNCDN
FUNCLP:	PUSHJ	P,LKAHD
	PUSHJ	JS,EXPREV
	AOS	FNCCNT
	MOVEI	0,FNCARG
	MOVEI	Z,$OPERA
	PUSH	P,Z
	PUSH	P,0
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .).]
	JRST	FUNCDN
	CAME	A,[ASCIZ .,.]
	JRST	ERRILF
	JRST	FUNCLP
FUNCDN:	MOVE	FNCCNT
	POP	JS,FNCCNT
	SUB	0,FNCCNT
	HRLZS
	HRRI	FNCC
	MOVEI	Z,$OPERA
	PUSH	P,Z
	PUSH	P,0
	POP	JS,F
	POPJ	JS,

ARRIT:	PUSH	P,ST
	PUSH	P,A
ARRSBS:	PUSHJ	P,SCAN		;FOR PARENTHESIS
	PUSH	JS,F
	TLZ	F,STREXP
	PUSHJ	JS,EXPREV
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .).]
	JRST	ARRPRN
	CAME	A,[ASCIZ","]
	JRST	ERRMCP
	PUSHJ	JS,EXPREV
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .).]
	JRST	ERRMCP
	MOVEI	0,ARSUB2
	SKIPA
ARRPRN:	MOVEI	0,ARSUB1
	MOVEI	Z,$OPERA
	PUSH	P,Z
	PUSH	P,0
	POP	JS,F
	POPJ	JS,

LKAHD:	PUSH	P,BP
	PUSH	P,OLDPT
	PUSH	P,NEWCT
	PUSH	P,CHRCT
	PUSH	P,OLDCT
LKAHD1:	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .(.]
	JRST	LKAHD1
	GOTO TAB9

LKAHDS:	TLOA	F,STREXP
LKAHDN:	TLZ	F,STREXP
	POP	P,OLDCT
	POP	P,CHRCT
	POP	P,NEWCT
	POP	P,OLDPT
	POP	P,BP
	POPJ	P,

GTOP:	PUSHJ	P,SCAN
	CAIE	ST,$OPERA
	JRST	DLMRT
	PUSHJ	JS,BINOP
	JRST	GTOP
DLMRT:	PUSHJ	P,STAKBK
	POPJ	JS,

BINOP:	MOVNI	Z,NUMOPS
BINOP1:	HLLZ	0,BINOPS+NUMOPS(Z)
	CAMN	A,0
	JRST	BINOP2
	AOJL	Z,BINOP1
	JRST	ERRILE		;SHOULDN'T GET HERE
BINOP2:	HRRZ	T1,BINOPS+NUMOPS(Z)
	PUSH	JS,T1
	,BINOPS+NUMOPS(Z)
	PUSH	JS,T1
	PUSHJ	JS,GTITM
	MOVE	T1,(JS)
	PUSHJ	JS,@BOPDSP-1(T1)
	MOVEI	0,$OPERA
	PUSH	P,0
	POP	JS,0
	PUSH	P,0
	POPJ	JS,

BINOPS:	BYTE (7)"↑"(29)EXPP
	BYTE (7)"/"(29)DIVV
	BYTE (7)"*"(29)MULL
	BYTE (7)"-"(29)SUBB
	BYTE (7)"+"(29)ADDD
NUMOPS==.-BINOPS

BOPDSP:	BADSUB
	BADSUB
	BMULDV
	BMULDV
	BEXP

LOWOPR:	PUSHJ	P,STAKBK
BEXP:	POPJ	JS,

BMULDV:	PUSHJ	P,SCAN
	CAIE	ST,$OPERA
	JRST	LOWOPR
	CAME	A,[ASCIZ .↑.]
	JRST	LOWOPR
	PUSHJ	JS,BINOP
	JRST	BMULDV

BADSUB:	PUSHJ	P,SCAN
	CAIE	ST,$OPERA
	JRST	LOWOPR
	CAME	A,[ASCIZ .+.]
	CAMN	A,[ASCIZ .-.]
	JRST	LOWOPR
	PUSHJ	JS,BINOP
	JRST	BADSUB

STEXEV:	PUSH	JS,C
	SETZ	C,
	TLZ	F,SNGSTR
	PUSHJ	JS,GTSITM
STEXE1:	PUSHJ	JS,STROP
	PUSHJ	JS,STFIN
	POP	JS,C
	POPJ	JS,

GTSITM:	PUSHJ	P,SCAN
	GOTO TAB2

STDL:	CAMN	A,[ASCIZ .(.]
	AOJA	C,GTSITM
	JRST	ERRNFO

STARIT:	SKIPA	Z,[PUSHJ	JS,ARRIT]
STFUNC:	MOVE	Z,[PUSHJ	JS,FUNC]
	TLNN	F,SNGSTR
	JRST	STNOPP
	MOVEI	0,$OPERA
	PUSH	P,0
	MOVEI	0,PUSH1
	PUSH	P,0
	PUSH	JS,C
	XCT	Z
	POP	JS,C
	MOVEI	0,$OPERA
	PUSH	P,0
	MOVEI	0,POP1
	PUSH	P,0
	POPJ	JS,

STNOPP:	XCT	Z
	POPJ	JS,

STROP:	PUSHJ	P,SCAN
	JUMPL	ST,STKBK2
	CAIN	ST,$OPERA
	JRST	STOPR
	JUMPE	C,STKBK2
	CAMN	A,[ASCIZ .).]
	SOJGE	C,STROP
STKBK2:	PUSHJ	P,STAKBK
	POPJ	JS,

STOPR:	CAME	A,[ASCIZ .+.]
	JRST	STKBK2
	TLOE	F,SNGSTR
	JRST	NXTCT
	MOVEI	A,CNCT0
	PUSH	P,ST
	PUSH	P,A
NXTCT:	PUSHJ	JS,GTSITM
	MOVEI	A,CNCT1
	MOVEI	ST,$OPERA
	PUSH	P,ST
	PUSH	P,A
	JRST	STROP

STFIN:	JUMPN	C,ERRUBP
	TLZN	F,SNGSTR
	POPJ	JS,
	MOVEI	A,CNCTL
	MOVEI	ST,$OPERA
	PUSH	P,ST
	PUSH	P,A
	POPJ	JS,

CODGEN:	SETZM	FNCCNT
	POP	JS,ST
	PUSH	P,ST
	POP	JS,A
	PUSH	P,A
CODLP:	CAIN	C,2
	JRST	CODDON
	POP	JS,ST
	POP	JS,A
	CAIN	ST,$OPERA
	JRST	CDOPER
	PUSH	P,ST
	PUSH	P,A
	JRST	CODLP

CDOPER:	SUBI	C,2
	HRRZ	ST,A
	JRST	@DOOP(ST)

DOOP:	CDUNSB
	CDADD
	CDSUB
	CDMULT
	CDDIV
	CDEXP
	CDCNC0
	CDCNC1
	CDCNCL
	CDFNRG
	CDFNC
	CDAR
	CDAR
	CDPSH1
	CDPOP1

CDUNSB:	MOVE	0,-1(P)
	CAILE	0,$FLOAT
	JRST	CDUSB2
	MOVE	0,(P)
	MOVNM	0,(P)
	JRST	CODLP
CDUSB2:	TLNN	0,INAC
	JRST	CDUSB3
	PUTSTR	[ASCIZ/	MOVNS	/]
	PUTSTR	(P)
	PUTSTR	COMMA
	PUTSTR	(P)
	PUTSTR	CRLF
	JRST	CODLP
CDUSB3:	PUSHJ	P,GETAC
	PUTSTR	[ASCIZ/	MOVN	/]
	PUTSTR	T1
	PUTSTR	COMMA
	PUSHJ	JS,GTVAR
	MOVEM	T1,(P)
	MOVE	0,-1(P)
	TLO	0,INAC
	MOVEM	0,-1(P)
	JRST	CODLP

COMMA:	ASCIZ/,/

CDMULT:	MOVEI	T2,1
	SKIPA
CDADD:	SETZ	T2,
	SUBI	C,2
	POP	P,A
	POP	P,ST
	MOVE	0,-1(P)
	CAILE	ST,$FLOAT
	JRST	CDADD1
	CAILE	0,$FLOAT
	JRST	CDADD2
	SUB	0,ST
	JUMPE	0,CDADDC
	CAIN	ST,1
	JRST	CDADC2
	EXCH	A,(P)
	EXCH	ST,-1(P)
CDADC2:	FLOAT	A,A
CDADCF:	XCT	FLOP(T2)
	JOVFL	ERROVF
	JRST	CODLP
CDADDC:	CAIE	ST,1
	JRST	CDADCF
	XCT	INTOP(T2)
	JOVFL	ERROVF
	JRST	CODLP


INTOP:	ADDM	A,(P)
	IMULM	A,(P)
	SUBM	A,(P)
	PUSHJ	JS,DIVDFL

DIVDFL:	AOS	0,-1(P)
	FLOAT	A,A
	FLOAT	0,(P)
	FDVR	A,0
	MOVEM	A,(P)
	POPJ	JS,

FLOP:	FADRM	A,(P)
	FMPRM	A,(P)
	FSBRM	A,(P)
	FDVRM	A,(P)

CDADD1:	CAILE	0,$FLOAT
	JRST	CDADVR
	EXCH	A,(P)
	EXCH	ST,-1(P)
CDADD2:	MOVE	0,-1(P)
	TLOE	0,INAC
	JRST	CDADD3
	MOVEM	0,-1(P)
	PUSHJ	P,GETAC
	PUSHJ	JS,GTVRAC
	MOVEM	T1,(P)
CDADD3:	CAIE	ST,$FLOAT
	FLOAT	A,A
	PUTSTR	@FOPST(T2)
	PUSHJ	JS,GTFLT
	JRST	CODLP

FOPST:	[ASCIZ/	FADR/]
	[ASCIZ/	FMPR/]
	[ASCIZ/	FSBR/]
	[ASCIZ/	FDVR/]
	[ASCIZ/	EXP/]

GTFLT:	TRNN	A,-1
	PUTCHR	["I"]
	PUTCHR	["	"]
	PUTSTR	(P)
	PUTSTR	COMMA
	TRNE	A,-1
	PUTCHR	["["]
	PUTSTR	[ASCIZ/↑O/]
	OCTLFT	A
	TRNN	A,-1
	JRST	FLTOUT
	OCTRT	A
	PUTCHR	["]"]
FLTOUT:	PUTSTR	CRLF
	POPJ	JS,

CDADVR:	TLNE	0,INAC
	JRST	CDADV2
	TLON	ST,INAC
	JRST	CDADV1
CDADV0:	EXCH	A,(P)
	EXCH	ST,-1(P)
	JRST	CDADV2
CDADV1:	PUSHJ	P,GETAC
	PUSH	P,A
	PUSHJ	JS,GTVRAC
	POP	P,A
	MOVE	A,T1
	TLO	ST,INAC
	JRST	CDADV0

CDADV2:	MOVE	0,-1(P)
	TLNE	0,ACPSHD
	PUSHJ	JS,RSTRAC
	PUTSTR	@FOPST(T2)
	PUTCHR	["	"]
	PUTSTR	(P)
	PUTSTR	COMMA
	PUSH	P,A
	PUSHJ	JS,GTVAR
	POP	P,A
	TLNN	ST,INAC
	JRST	CODLP
	MOVE	T1,A
	PUSHJ	P,FREEAC
	JRST	CODLP

CDDIV:	MOVEI	T2,3
	SKIPA
CDSUB:	MOVEI	T2,2
	SUBI	C,2
	POP	P,A
	POP	P,ST
	MOVE	0,-1(P)
	CAILE	ST,$FLOAT
	JRST	CDSUB1
	CAILE	0,$FLOAT
	JRST	CDADD2
	SUB	0,ST
	JUMPE	0,CDSUBC
	CAIN	ST,$INTEG
	FLOAT	A,A
CDSBCF:	EXCH	A,(P)
	MOVEI	ST,$FLOAT
	EXCH	ST,-1(P)
	CAIN	ST,$INTEG
	FLOAT	A,A
	XCT	FLOP(T2)
	JOVFL	ERROVF
	JRST	CODLP
CDSUBC:	CAIE	ST,1
	JRST	CDSBCF
	EXCH	A,(P)
	EXCH	ST,-1(P)
	XCT	INTOP(T2)
	JOVFL	ERROVF
	JRST	CODLP

CDSUB1:	CAILE	0,$FLOAT
	JRST	CDSBVR
	CAIE	0,$INTEG
	JRST	CDSUB2
	FLOAT	T1,(P)
	MOVEM	T1,(P)
CDSUB2:	PUSHJ	P,GETAC
	PUSHJ	JS,GTINT1
CDSBVR:	TLNE	0,INAC
	JRST	CDADV2
	EXCH	A,(P)
	EXCH	ST,-1(P)
	JRST	CDADV1

GTINT1:	SETO	Z,
	MOVE	0,(P)
	TRCN	0,-1
	SETZ	Z,
	TRCN	0,-1
	MOVEI	Z,1
	JUMPL	Z,GTFULL
	PUSH	JS,Z
	PUTSTR	[ASCIZ/	HRL/]
	POP	JS,Z
	PUTSTR	ZOROI(Z)
	PUTSTR	T1
	PUTSTR	[ASCIZ/,↑O/]
	OCTLFT	(P)
	PUTSTR	CRLF
	JRST	GTINRT
GTFULL:	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	[ASCIZ/,[↑O/]
	OCTLFT	(P)

	OCTRT	(P)
	PUTSTR	[ASCIZ/]
/]
GTINRT:	MOVEM	T1,(P)
	MOVE	0,[INAC,,$NUVAR]
	MOVEM	0,-1(P)
	POPJ	JS,

ZOROI:	ASCIZ/ZI	/
	ASCIZ/OI	/

CDEXP:	SUBI	C,2
	MOVEI	T2,4
	POP	P,A
	POP	P,ST
	MOVE	0,-1(P)
	CAILE	0,$FLOAT
	JRST	CDEXP1
	CAIL	0,$FLOAT
	JRST	CDCEXP
	FLOAT	T1,(P)
	MOVEM	T1,(P)
	AOS	,-1(P)
CDCEXP:	PUSHJ	P,GETAC
	PUSHJ	JS,GTINT1
CDCEX1:	CAILE	ST,$FLOAT
	JRST	CDADV2
	CAILE	ST,$INTEG
	JRST	CDADD3
	PUTSTR	[ASCIZ/	IEXP/]
	PUSHJ	JS,GTINT
	JRST	CODLP

CDEXP1:	TLOE	0,INAC
	JRST	CDCEX1
	PUSHJ	P,GETAC
	PUSH	JS,0
	PUSHJ	JS,GTVRAC
	POP	JS,0
	MOVEM	T1,(P)
	MOVEM	0,-1(P)
	JRST	CDCEX1

GTVRAC:	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	COMMA
GTVAR:	PUTSTR	(P)
	TLNN	F,FNEVFL
	JRST	VAREND
	MOVNI	Z,NMUARG
	PUSH	JS,A
	MOVE	A,(P)
UARCHK:	CAMN	A,USRARG+NMUARG(Z)
	JRST	UARPUT
	AOJL	UARCHK
	
	JRST	VAREND-1
UARPUT:	PUTCHR	["%"]
	POP	JS,A
VAREND:	PUTSTR	CRLF
	POPJ	JS,

GTINT:	TLNN	A,-1
	PUTCHR	["I"]
	PUTCHR	["	"]
	PUTSTR	(P)
	PUTSTR	COMMA
	TLNE	A,-1
	PUTCHR	["["]
	PUTSTR	[ASCIZ/↑O/]
	TLNE	A,-1
	OCTLFT	A
	OCTRT	A
	TLNE	A,-1
	PUTCHR	["]"]
	PUTSTR	CRLF
	POPJ	JS,

CDFNRG:	SUBI	C,1
	MOVE	T1,(P)
	MOVE	T2,-1(P)
	TLZE	T2,INAC
	JRST	CDFNMM
	CAILE	T2,$FLOAT
	JRST	CDFNVR
	MOVE	T1,(P)
	CAIG	T2,$INTEG
	FLOAT	T1,(P)
	MOVEM	T1,(P)
	MOVEI	T2,$FLOAT
	MOVEM	T2,-1(P)
	PUSHJ	P,GTACNP
	PUSHJ	JS,GTINT1
CDFNMM:	MOVEM	T1,(P)
	MOVE	T2,ARGTYP(T2)
	MOVEM	T2,-1(P)
	PUTSTR	MOVEM.
	PUTSTR	(P)
	PUTSTR	[ASCIZ/,Z/]
	MOVE	T1,FNCCNT
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ/#
/]
	AOS	FNCCNT
	POP	P,T1
	PUSHJ	P,FREEAC
	JRST	CODLP

CDFNVR:	PUSHJ	P,GETAC
	CAIN	T2,$STCON
	JRST	CDFNST
	PUSHJ	JS,GTVRAC
	JRST	CDFNMM

CDFNST:	PUTSTR	MOVEI.
	PUTSTR	T1
	PUTSTR	[ASCIZ/,S/]
	PUSHJ	P,DECASC
	AOS	STRCT
	PUTSTR	CRLF
	JRST	CDFNMM

	DEFINE LASC (N),<
	BYTE	(7)"N"
>

ARGTYP:	LASC 0
	LASC	0
	LASC	2
	LASC	2
	LASC	0
	LASC	5
	LASC	0
REPEAT 2,<LASC 0
	LASC 5>
	LASC 2
REPEAT 3,<LASC 0>
REPEAT 2,<LASC 2
	LASC 5>
	LASC 0

CDFNC:	HLRZ	T2,A
	JUMPE	T2,FNCDN0
	SUB	C,T2
CDFNLP:	POP	P,0
	PUSH	JS,0
	SOJG	T2,CDFNLP
	HLRZ	T2,A
FNCDN0:	POP	P,A
	POP	P,ST
	PUTSTR	[ASCIZ/	JSA	IO,/]
	PUSHJ	P,OUTFNC
	TLO	F,EXTFLG
	CAIE	ST,$USTFN
	CAIN	ST,$UNUFN
	PUSHJ	P,EXTCHK
	TLZE	F,EXTFLG
	PUTSTR	[ASCIZ/##/]
	PUTSTR	CRLF
	JUMPE	T2,FNCDN2
	PUSH	P,C
	MOVN	C,T2
FNCDN1:	PUTSTR	JUMP.
	POP	JS,T1
	PUTSTR	T1
	PUTSTR	[ASCIZ/,Z/]
	MOVE	T1,FNCCNT
	ADD	T1,C
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	AOJL	C,FNCDN1
	POP	P,C
FNCDN2:	MOVE	0,FNCCNT
	SUB	0,T2
	MOVEM	0,FNCCNT
	PUSHJ	P,GETAC
	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	[ASCIZ/,0
/]
	MOVEI	T2,$NUVAR
	CAIE	ST,$USTFN
	CAIN	ST,$STFNC
	MOVEI	ST,$STVAR
	TLO	T2,INAC
	PUSH	P,T2
	PUSH	P,T1
	JRST	CODLP

EXTCHK:	TLZ	F,EXTFLG
	MOVNI	Z,NUSRFN
UFNSRC:	CAMN	A,USRFNC+NUSRFN(Z)
	JRST	UFNEQ
	AOJL	Z,UFNSRC
	TLO	F,EXTFLG
UFNEQ:	POPJ	P,

OUTFNC:	CAIE	ST,$USTFN
	CAIN	ST,$UNUFN
	JRST	OUTUFN
	CAIN	ST,$NUFNC
	JRST	NUTFNC
	MOVNI	Z,NUMSTF
FNSTSR:	CAMN	A,STRFNC+NUMSTF(Z)
	JRST	OUTUFN
	AOJL	Z,FNSTSR
	JRST ERRCOM
NUTFNC:	MOVNI	Z,NUMBFN
FNSRCH:	CAMN	A,BASFNC+NUMBFN(Z)
	JRST	FNEQ
	AOJL	Z,FNSRCH
	JRST ERRCOM
FNEQ:	MOVEI	0,BASFNC+NUMBFN(Z)
	CAIL	0,BASONY
	JRST	OUTUFN
	ASH	Z,1
	PUTSTR	F40FNC+NUMBFN*2(Z)
	POPJ	P,
OUTUFN:	PUTSTR	A
	POPJ	P,

CDAR:	MOVE	ST,-1(P)
	CAIE	ST,$INTEG
	CAIN	ST,$FLOAT
	JRST	CDARCN
	PUTSTR	[ASCIZ/	FIX	.X,/]
	PUSHJ	JS,GTVAR
	MOVE	T1,(P)
	TLZE	ST,INAC
	PUSHJ	P,FREEAC
	CAIE	A,ARSUB2
	JRST	CDARGT
CDAR2:	POP	P,0
	POP	P,0
	PUTSTR	[ASCIZ/	IMUL	.X,/]
	PUTSTR	-2(P)
	PUTSTR	[ASCIZ/..
/]
	SUBI	C,2
	AOJ	A,
	MOVE	ST,-1(P)
	CAIE	ST,$INTEG
	CAIN	ST,$FLOAT
	JRST	CDARCN
	PUSHJ	P,GTACNP
	PUTSTR	[ASCIZ/	FIX	/]
	PUTSTR	T1
	PUTSTR	COMMA
	PUSHJ	JS,GTVAR
	PUTSTR	[ASCIZ/	ADD	.X,/]
	PUTSTR	T1
	PUTSTR	CRLF
	PUSHJ	P,FREEAC
CDARGT:	POP	P,0
	POP	P,0
	PUSHJ	P,GETAC
	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	COMMA
	PUTSTR	(P)
	PUTCHR	["."]
	CAIL	A,ARSUB2
	PUTSTR	[ASCIZ/.+1/]
	PUTSTR	[ASCIZ/(.X)
/]
CDARRT:	MOVEM	T1,(P)
	MOVE	ST,-1(P)
	MOVEI	T1,$NUVAR
	CAIN	ST,$STARR
	MOVEI	T1,$STVAR
	TLO	T1,INAC
	MOVEM	T1,-1(P)
	SUBI	C,2
	JRST	CODLP

CDARCN:	MOVE	T1,(P)
	CAIE	ST,$INTEG
	FIX	T1,(P)
	MOVEM	T1,(P)
	CAIE	A,ARSUB2
	JRST	CDARC1
	PUTSTR	MOVEI.
	PUTSTR	[ASCIZ/.X,↑O/]
	OCTRT	(P)
	PUTSTR	CRLF
	JRST	CDAR2
CDARC1:	POP	P,T2
	POP	P,0
	PUSHJ	P,GETAC
	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	COMMA
	PUTSTR	(P)
	PUTCHR	["."]
	CAIL	A,ARSUB2
	PUTSTR	[ASCIZ/.+1/]
	PUTSTR	[ASCIZ/+↑O/]
	OCTRT	T2
	CAIL	A,ARSUB2
	PUTSTR	[ASCIZ/(.X)/]
	PUTSTR	CRLF
	JRST	CDARRT

CDPSH1:	PUTSTR	[ASCIZ/	PUSH	PP,1
/]
	JRST	CODLP

CDPOP1:	PUTSTR	[ASCIZ/	POP	PP,1
/]
	JRST	CODLP

CDCNC0:	PUTSTR	[ASCIZ .	PUSHJ	PP,GETCOR
	MOVEM	1,CORPTR#
	HRLI	1,↑O440700
.]
	ADDI	C,2

CDCNC1:	MOVE	ST,-1(P)
	CAIE	ST,$STCON
	JRST	CDCNCV
	PUTSTR	[ASCIZ/	MOVEI	0,S/]
	PUSHJ	P,DECASC
	PUTSTR	CRLF
	AOS	STRCT
	JRST	CDCNCD
CDCNCV:	PUTSTR	[ASCIZ/	MOVE	0,/]
	PUSHJ	JS,GTVAR
	MOVE	T1,(P)
	TLNE	ST,INAC
	PUSHJ	P,FREEAC
CDCNCD:	PUTSTR	[ASCIZ/	PUSHJ	PP,CONCAT
/]
	POP	P,0
	POP	P,0
	SUBI	C,2
	JRST	CODLP

CDCNCL:	PUTSTR	[ASCIZ/	SETZ
	IDPB	1
/]
	PUSHJ	P,GETAC
	PUTSTR	MOVE.
	PUTSTR	T1
	PUTSTR	[ASCIZ/,CORPTR
/]
	MOVEI	0,$STVAR
	TLO	0,INAC
	PUSH	P,0
	PUSH	P,T1
	JRST	CODLP

GTACNP:	TLO	F,NOPUSH
GETAC:	MOVNI	Z,4
GETLP:	MOVE	T1,ACLST+4(Z)
	TRON	T1,7
	JRST	GOTAC
	AOJL	Z,GETLP
	JRST	NOACS
GOTAC:	MOVEM	T1,ACLST+4(Z)
	TRZ	T1,7
	TLZ	F,NOPUSH
	POPJ	P,

NOACS:	TLZE	F,NOPUSH
	JRST	GOTAC
	HRRZ	Z,P
NOACLP:	SUBI	Z,2
	HRRZ	0,(Z)
	CAIE	0,$NUVAR
	CAIN	0,$STVAR
	JRST	ITINAC
	JRST	NOACLP
ITINAC:	MOVE	0,(Z)
	TLNN	0,INAC
	JRST	NOACLP
	TLO	0,ACPSHD
	MOVEM	0,(Z)
	MOVNI	Z,4
ACZER:	MOVE	T1,ACLST+4(Z)
	TRZ	T1,7
	MOVEM	T1,ACLST+4(Z)
	AOJL	Z,ACZER
	MOVE	T1,ACLST+4
	TRO	T1,7
	MOVEM	T1,ACLST+4
	TRZ	T1,7
	PUTSTR	[ASCIZ/	PUSH	PP,VAL
	PUSH	PP,.T1
	PUSH	PP,.T2
	PUSH	PP,.T3
/]
	POPJ	P,

RSTRAC:	MOVE	0,ACLST+4
	TROE	0,7
	JRST	RSTR2
	PUTSTR	[ASCIZ/	MOVE	.T4,/]
	PUTSTR	A
	PUTSTR	CRLF
	MOVE	A,[ASCIZ/.T4/]
RSTR2:	MOVNI	Z,5
RSTRLP:	MOVE	0,ACLST+5(Z)
	TRZ	0,7
	MOVEM	0,ACLST+5(Z)
	AOJL	Z,RSTRLP
	MOVE	0,-1(P)
	TLZ	0,ACPSHD
	MOVEM	0,-1(P)
	PUTSTR	[ASCIZ/	POP	PP,.T3
	POP	PP,.T2
	POP	PP,.T1
	POP	PP,VAL
/]
	POPJ	JS,

FREEAC:	MOVNI	Z,5
FREELP:	MOVE	0,ACLST+5(Z)
	TRZ	0,7
	CAME	0,T1
	AOJL	Z,FREELP
	MOVEM	0,ACLST+5(Z)
	POPJ	P,

CODDON:	MOVE	0,-1(P)
	CAIE	0,$INTEG
	CAIN	0,$FLOAT
	JRST	CDDNCN
	CAIN	0,$STCON
	JRST	CDDSCN
	TLZN	0,INAC
	JRST	CDDNMM
	TRNE	F,INTFLG
	JRST	CDDNMM
	MOVE	1,(P)
	CAMN	1,[ASCIZ/VAL/]
	JRST	CODRT
CDDNMM:	TRNE	F,INTFLG
	JRST	CDDNFX
	MOVE	T1,[ASCIZ/VAL/]
	PUSHJ	JS,GTVRAC
	JRST	CODRT
CDDNFX:	PUTSTR	[ASCIZ/	FIX	VAL,/]
	PUSHJ	JS,GTVAR
	JRST	CODRT
CDDSCN:	PUTSTR	[ASCIZ/	MOVEI	VAL,S/]
	PUSHJ	P,DECASC
	PUTSTR	CRLF
	AOS	STRCT
	JRST	CODRT

CDDNCN:	CAIE	0,$INTEG
	JRST	CDDNCF
	TRZE	F,INTFLG
	JRST	CDDNCI
	FLOAT	A,(P)
	MOVEM	A,(P)
CDDNCF:	TRNN	F,INTFLG
	JRST	CDDNFL
	PUTSTR	[ASCIZ/	FIX	VAL,[↑O/]
	OCTLFT	(P)
	OCTRT	(P)
	PUTSTR	[ASCIZ/]
/]
	JRST	CODRT
CDDNCI:	MOVE	A,[ASCIZ/VAL/]
	EXCH	A,(P)
	PUTSTR	[ASCIZ .	MOVE.]
	PUSHJ	JS,GTINT
	JRST	CODRT
CDDNFL:	MOVE	T1,[ASCIZ/VAL/]
	PUSHJ	JS,GTINT1
CODRT:	POP	P,T1
	POP	P,ST
	TLNE	ST,INAC
	PUSHJ	P,FREEAC
	MOVE	T1,[ASCIZ/VAL/]
	PUSHJ	P,FREEAC
	POPJ	P,

	SUBTTL DISPATCH TABLES			HOFFMAN/COURTNEY 4/74

TAB1:	$INPUT,,INPT
	$READ,,REED
	$DATA,,RLINE
	$PRINT,,PRNT
	$LET,,LETT
	$GOTO,,GO2
	$IF,,IF
	$FOR,,FORLP
	$NEXT,,ENDLP
	$END,,EOFB
	$FILES,,RLINE
	$GOSUB,,GOSUB
	$ON,,ON
	$STOP,,STOP
	$REM,,RLINE
	$DIM,,ELOGLN
	$DEF,,ELOGLN
	$CHANG,,CHGSTR
	$RETUR,,RETUR
	$RANDO,,STRAN
	$RESTO,,RESTOR
	$SCRAT,,SCRFIL
	$DELIM,,DLIMST
	-1,,RLINE
TAB1A:	$NUVAR,,VARP1			;NUMERIC VARIABLE
	$STVAR,,STRP1			;STRING VARIABLE
	$NUARR,,LETIND			;ARRAY ELEMENT
	$STARR,,LETIND			;STRING ARRAY ELEMENT
	0,,ERRKNR			;KEYWORD NOT RECOGNIZED

TAB2:	$STFNC,,STFUNC
	$STCON,,CONST
	$DELIM,,STDL
	$STVAR,,CONST
	$STARR,,STARIT
	$USTFN,,STFUNC
	0,,ERRNFO

TAB3:	$STFNC,,IFSTR
	$STCON,,IFSTR			;LH OF IF IS CONSTANT
	$STVAR,,IFSTR			;LH OF IF IS STRING VARIABLE
	$STARR,,IFSTR			;LH OF IF IS STRING ARRAY ELEMENT
	$USTFN,,IFSTR
	0,,IFEXP			;LH OF IF IS EXPRESSION

TAB4:	$STFNC,,PRSTR
	$STCON,,PRSTR
	$DELIM,,PRDLIM
	$STVAR,,PRSTR
	$STARR,,PRSTR
	$USTFN,,PRSTR
	-1,,PREN2
	0,,PREVAL

TAB5:	$STEP,,LPTHRD
	-1,,LPNTHR
	0,,ERRFMT

TAB6:	$NUVAR,,INNUM
	$STVAR,,INSTR
	$NUARR,,INARR
	$STARR,,INARR
	0,,ERRINP

TAB7:	$INTEG,,CONST
	$FLOAT,,CONST
	$NUVAR,,CONST
	$OPERA,,UNARY
	$DELIM,,DLRCRS
	$NUFNC,,FUNC
	$NUARR,,ARRIT
	$UNUFN,,FUNC
	0,,ERRNFO

TAB8:	$NUVAR,,CNVR
	$STFNC,,CSTR
	$STCON,,CSTR
	$STVAR,,CSTR
	$STARR,,CSTR
	$USTFN,,CSTR
	0,,ERRFMT

TAB9:	$STFNC,,LKAHDS
	$STCON,,LKAHDS
	$STVAR,,LKAHDS
	$STARR,,LKAHDS
	$USTFN,,LKAHDS
	0,,LKAHDN

TABEND:	-1,,RLINE
	$DELIM,,LNCONT			;BACKSLASH LINE CONTINUATION
	0,,ERREND			;EOL NOT FOUND WHERE EXPECTED

	;TABLE FOR PASS 1
INS1:	JRST	GOTNAM			;3
	JRST	SCNERR			;4
	REPEAT 2,<JRST	RESC>		;5,6
	JRST	SCNERR			;7
	JRST	SCON			;8
	JRST	RESC			;9
	JRST	GOTNAM			;10
	JRST	RESC			;11
	REPEAT 3,<JRST	SCNERR>		;12-14
	REPEAT 2,<JRST	GOTARR>		;15,16

INS2:	JRST	RESC			;30
	JRST	DATMOD			;31
	JRST	RESC			;32
	TRO	F,LUPFLG		;33
	JRST	DEFMOD			;34
	JRST	ADDX			;35
	JRST	DIMEN			;36
	JRST	FILHNL			;37


	SUBTTL	COMMAND SCANNING AND FILE INITIALIZATION	HOFFMAN 5/74

BAS10:	TROA	F,CCLENT			;REGULAR ENTRY
	TRZ	F,CCLENT			;CCL ENTRY
	RESET
	MOVE	[POINT 7,MACBUF]		;ESTABLISH PERMANENT
	MOVEM	MCBFPT				; POINTERS
	MOVE	[POINT 7,COMSTR]
	MOVEM	CMSTPT
	MOVEI	75*5
	MOVEM	MCBFCT
	MOVE	P,[IOWD STKLEN,PDL]			;SET UP PUSHDOWN LIST
	TRZ	F,ONEFLG
RERUN:	IFE FTDEBUG,<MOVEI	PROG+LINLEN*LINBLK-1
	CORE					;GET CORE FOR PASS 1
	DIE	<NOT ENOUGH CORE>>
	ANDI	F,CCLENT!ONEFLG			;ZERO IRRELEVANT FLAGS
	SETZM	SRCDEV
	SETZM	OBJDEV
	SETZM	LSTDEV
	SETZM	USRFNC
	MOVE	[USRFNC,,USRFNC+1]
	BLT	VARS+571			;WATCH IT IF STUFF ADDED
						;TO LOW SEGMENT
	TRNN	F,CCLENT			;IF CCL,
	JRST	CCENT
NONCCL:	MOVE	BP,[POINT 7,COMSTR]		;IF NOT CCL,
	MOVEM	BP,CMSTPT			;ENTER COMMAND STRING
	OUTSTR	[ASCIZ .
*.]						; FROM TTY
CLP:	INCHWL
	IDPB	BP
	CAIN	LF
	JRST	BKCH
	CAIE	ALT
	JRST	CLP
BKCH:	SETZ
	IDPB	BP
	JRST	DONIN

CCENT:	TROE	F,ONEFLG			;IF CCL,
	JRST	DONIN				; HAVE WE READ IN WHOLE STRING?
	MOVE	[2,,TMP1]			;NO; TRY TMPCOR
	TMPCOR
	SKIPA
	JRST	DONIN				;GOT IT
	OPEN	0,OP17				;NO; TRY DSK
	HALT
	HLLZ	S1,TMPNAM
	HLLM	S1,TM1
	LOOKUP	0,TM1
	JRST	[TRO	F,CCLENT		;NOT THERE EITHER. PRETEND
	JRST	NONCCL]				; WE WERE ENTERED NORMALLY
	IN	0,[IOWD 75,COMSTR
	Z]
	SKIPA
	DIE	<CCL INPUT ERROR>
	RELEAS	0,

DONIN:	MOVE	CH,CMSTPT

ISCR:	SETZM	FILNAM				;SCAN COMMAND STRING
	MOVE	[FILNAM,,FILNAM+1]		; FROM LAST POINT
	BLT	LSTNAM+3
	MOVEI	1
	MOVEM	SRCNAM+1
	MOVEM	OBJNAM+1
	MOVEM	LSTNAM+1
AFTZ:	ILDB	CH
	CAIN	ALT
	JRST	BRKCHR
	CAIE	CR
	JRST	NOTTCR
	IBP	CH
BRKCHR:	MOVE	[FILNAM,,SRCNAM]		;IF CR, EAT LF AND
	BLT	SRCNAM+3			; PUT FILNAM -> SOURCE NAME
	MOVE	DEV
	MOVEM	SRCDEV
	JRST	GOTALL

NOTTCR:	CAIE	"←"				;IF = OR ←,
	CAIN	"="
	JRST	EQARR
	CAIN	","				;IF ","
	JRST	ISCOM
	SOJ	CH,
	REPEAT 4,<IBP CH>			;IF NONE OF THE ABOVE,
	PUSHJ	P,FILBRK			; DECREMENT BP AND SCAN
	JRST	AFTZ				; FOR FILE NAME

ISCOM:	TLOE	F,COMFLG
	JRST	ERRIFS
OBJDEF:	MOVE	[FILNAM,,OBJNAM]
	BLT	OBJNAM+3
	MOVE	DEV
	MOVEM	OBJDEV
	CAMN	[SIXBIT .TTY.]
	TLO	F,TTYFLG
	JRST	ISCR
EQARR:	TLOE	F,ARRFLG
	JRST	ERRIFS
	TLNN	F,COMFLG
	JRST	OBJDEF
	MOVE	[FILNAM,,LSTNAM]		;IF , WE HAVE LSTNAM
	BLT	LSTNAM+3
	MOVE	DEV
	MOVEM	LSTDEV
	JRST	ISCR
GOTALL:	MOVEM	CH,CMSTPT
	SKIPN	SRCNAM
	SKIPE	SRCDEV
	SKIPA	T1,[SIXBIT .NONAME.]
	JRST	RERUN
	SKIPN	SRCNAM
	MOVEM	T1,SRCNAM
	MOVE	T1,SRCNAM
	SKIPN	OBJNAM
	MOVEM	T1,OBJNAM
	MOVSI	(SIXBIT .BAS.)
	MOVE	T1,SRCNAM+1
	TRNE	T1,1
	MOVEM	SRCNAM+1
	MOVSI	(SIXBIT .DSK.)
	SKIPN	SRCDEV
	MOVEM	SRCDEV
	SKIPN	OBJDEV
	MOVEM	OBJDEV
	SKIPN	LSTDEV
	SKIPN	LSTNAM
	SKIPA
	MOVEM	LSTDEV

	OPEN	0,OP0				;GET SRCDEV FOR PROGRAM INPUT
	JRST	[OUTSTR	[ASCIZ .?INPUT DEVICE NOT AVAILABLE
.]
	JRST	RERUN]
	JSP	JS,OPNA
	EXP IBUF
	SETZM	ASCNAM
	SETZM	ASCNAM+1
	MOVE	BP,[POINT 6,SRCNAM]
	MOVE	S3,[POINT 7,ASCNAM]
	MOVEI	C,6
TLP:	ILDB	CH,BP
	JUMPE	CH,SJG
	ADDI	CH,↑O40
	IDPB	CH,S3
SJG:	SOJG	C,TLP
	LOOKUP	0,SRCNAM			;AND LOOKUP SOURCE
	JRST	FNF
	TRNN	F,CCLENT
	OUTSTR	[ASCIZ .BASIC:	.]		;IF CCL SAY "BASIC: FNAME"
	OPEN	1,OP1				;GET OBJDEV FOR OBJECT OUTPUT
	JRST	[OUTSTR	[ASCIZ .?OBJECT DEVICE NOT AVAILABLE
.]
	JRST	RERUN]
	JSP	JS,OPNB
	EXP OBUF
	MOVSI	(SIXBIT .MAC.)
	MOVE	T1,OBJNAM+1
	TRNE	T1,1
	MOVEM	OBJNAM+1
	ENTER	1,OBJNAM			;ENTER OBJECT FILE
	DIE	<CANNOT ENTER OBJECT PROGRAM>
	PUTSTR	[ASCIZ .	TITLE	.]	;ENTER PROGRAM TITLE
	TRNN	F,CCLENT
	OUTSTR	ASCNAM				;AND SAY IT
	PUTSTR	ASCNAM
	TRNN	F,CCLENT
	OUTSTR	CRLF
	PUTSTR	BGNSTR
	SETZB	X,ERRCNT
	SETZM	CURNUM
	SETZM	STRCT
	SETZM	FILCNT
	MOVE	[POINT 7,PROG]
	TRNE	F,NOSORT
	MOVE	[POINT 7,DATARE]
	MOVEM	DATPT
	MOVEI	S2,PROG+LINLEN*LINBLK-1		;HIGHEST CORE LOCATION

RESEE:	MOVEI	C,LINBLK
NXTLIN:	MOVE	BP,[POINT 7,PROG(X)]		;START NEXT LINE
	SETZ	S3,
	TRZ	F,GENFLG
LINELP:	SOSGE	IBUF+2				;GET A CHARACTER
	JRST	GETBFA
	ILDB	CH,IBUF+1
	JUMPE	CH,LINELP
	CAIE	CH,CR				;CR?
	JRST	PLCHR
	TRNN	F,GENFLG
	SETO	S3,
PLCHR:	SKIPN	S3
	IDPB	CH,BP
	TRO	F,GENFLG
	CAIE	CH,LF
	JRST	LINELP				;PUT IT AWAY AND GET ANOTHER
	SETZ
	IDPB	BP

	SETBP	PROG(X)				;UNLESS AT END
	TLO	F,WNUMFL
	PUSHJ	P,SCAN
	CAIN	ST,$INTEG
	SKIPE	STRING+1
	JRST	ERRMLN
	TRNE	F,NOSORT
	JRST	NSRTE
	MOVEM	A,CURNUM
	ADDI	X,LINLEN
	SOJG	C,NXTLIN
IFE FTDEBUG<MOVEI	S1,15*68(S2)		;IF AT END OF BUFFER,
	MOVE	S2,S1				;EXPAND CORE AND KEEP
	CORE	S1,>				;RECORD OF ITS SIZE IN S2
	DIE	<OUT OF CORE>
	JRST	RESEE

ERRMLN:	OUTSTR	[ASCIZ .% MISSING OR BAD LINE NUMBER FOLLOWING LINE .]
	MOVE	T1,CURNUM
	PUSHJ	P,DASCOU
	OUTSTR	CRLF
	JRST	NXTLIN

EOFA:	RELEAS	0,				;AT THE END OF THE SOURCE,
	SUBI	X,LINLEN
	MOVEM	X,FINX				;AND PUT AWAY FINAL X
	JUMPL	X,RERUN
	JUMPE	X,WSORT

	SUBTTL PASS 1					HOFFMAN 4/74

	SETZ	X,
SORT1:	MOVE	C,X				;ROUTINE TO SORT STATEMENTS
SORT2:	SETBP	PROG(C)
	TLO	F,WNUMFL
	PUSHJ	P,SCAN
	MOVE	CH,A
	SETBP	PROG+LINLEN(C)
	TLO	F,WNUMFL
	PUSHJ	P,SCAN
	CAMGE	CH,A				;COMPARE THE NUMBERS
	JRST	EOS1				;ARE THEY IN ORDER?
	CAMN	CH,A				;NO; SWAP THEM
	JRST	[SETZM	PROG(C)
	JRST	EOS1]
	MOVEI	S1,PROG(C)
	MOVEI	S2,PROG+LINLEN(C)
	MOVEI	CH,LINLEN
MLP:	MOVE	A,(S1)
	EXCH	A,(S2)
	MOVEM	A,(S1)
	AOJ	S1,
	AOJ	S2,
	SOJG	CH,MLP
	SUBI	C,LINLEN
	JUMPG	C,SORT2
EOS1:	ADDI	X,LINLEN			;CONSIDER NEXT 2 STATEMENTS
	CAME	X,FINX				;UNLESS DONE
	JRST	SORT1
WSORT:	OPEN	0,OP2				;GET DSK FOR TMP OUTPUT
	HALT
	JSP	JS,OPNA
	EXP OBF
	PJOB	S1,
	MOVEI	3
PLP:	IDIVI	S1,10
	ADDI	S2,↑O20
	LSHC	S2,-6
	SOJG	0,PLP
	HLLM	S3,TMPNAM
	ENTER	0,TMPNAM			;ENTER TEMP FILE
	DIE	<CANNOT ENTER TMPFIL>
	SETZ	X,
WLP:	SKIPN	PROG(X)				;PUT AWAY CORRECTED LINES
	JRST	ADDX
	MOVE	BP,[POINT 7,PROG(X)]
CHLP:	ILDB	CH,BP
	SOSG	OBF+2
	JRST	PUTBUF

PLCH:	IDPB	CH,OBF+1
	CAIE	CH,LF
	JRST	CHLP
	SETBP	PROG(X)
	TLO	F,WNUMFL
	PUSHJ	P,SCAN
NSRTE:	MOVEM	A,CURNUM
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .'.]
	JRST	ADDX
	SKIPA
RESC:	PUSHJ	P,SCAN				;VARIABLE NAMES
	JUMPL	ST,ADDX				;IF EOL, JRST ADDX
	MOVE	T1,ST
	CAIL	ST,$BGNKY
	CAILE	ST,$TOPS1
	SKIPA
	JRST	EXEC2
	CAIL	ST,$NUVAR
	CAILE	ST,$STARR
	JRST	RESC

	SUBI	T1,3
	XCT	INS1(T1)
	JRST	RESC

EXEC2:	SUBI	T1,$BGNKY
	XCT	INS2(T1)
	JRST	RESC

SCNERR:	OUTSTR	PROG(X)
	PUTSTR	[ASCIZ .;SCANNING ERROR
.]
	MOVEI	T1,[ASCIZ .?SCANNING ERROR.]
	PUSHJ	P,ERRDPL
	JRST	ADDX

SCON:	PUTCHR	["S"]
	PUSHJ	P,DECASC
	PUTSTR	[ASCIZ/:ASCIZ"/]
	PUTSTR	STRING
	PUTSTR	[ASCIZ/"
/]
	AOS	STRCT
	JRST	RESC

DATMOD:	TRO	F,DATFLG
DATMD1:	ILDB	BP
	CAIN	" "
	JRST	DATMD1
	SKIPA
DATLP:	ILDB	BP
	CAIN	CR
	JRST	ELINE
	IDPB	DATPT
	JRST	DATLP
ELINE:	SETZ
	IDPB	DATPT
	IDPB	DATPT
	SOS	DATPT
	REPEAT 4,<IBP DATPT>
	JRST	ADDX

FILHNL:	MOVE	CH,BP
FILHN1:	PUSHJ	P,FILBRK
	AOS	T1,FILCNT
	SKIPN	FILNAM
	SKIPE	DEV
	SKIPA
	JRST	FILHN2
	PUTCHR	["O"]
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ":	Z
"]
	SKIPN	T1,DEV
	MOVSI	T1,(SIXBIT .DSK.)
	PUSHJ	P,SIXOUT
	PUTSTR	[ASCIZ"	A"]
	MOVE	T1,FILCNT
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ",,B"]
	MOVE	T1,FILCNT
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ"
C"]
	MOVE	T1,FILCNT
	PUSHJ	P,DCASC1
	PUTCHR	[":"]
	MOVE	T1,FILNAM
	PUSHJ	P,SIXOUT
	MOVE	T1,FILNAM+1
	TRNE	T1,1
	MOVSI	T1,(SIXBIT .BAS.)
	PUSHJ	P,SIXOUT
	PUTSTR	[ASCIZ"	Z
	"]
	HLRZ	T1,FILNAM+3
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ",,"]
	HRRZ	T1,FILNAM+3
	PUSHJ	P,DCASC1
	PUTSTR	[BYTE (7)CR,LF,CR,LF,0]
FILHN2:	ILDB	T1,CH
	CAIN	T1,"\"
	JRST	RESC
	CAIN	T1,CR
	JRST	ADDX
	CAIE	T1,","
	CAIN	T1,";"
	JRST	FILHN1
	JRST	ERRFMT

DEFMOD:	MOVEM	BP,PTSTOR
	PUSHJ	P,SCAN
	CAIN	ST,$USTFN
	JRST	DFSTFN
	CAIE	ST,$UNUFN
	JRST	ERRBFN

DFNUFN:	PUSHJ	P,GETARG
	PUSHJ	P,EVAL
FNCONT:	PUTSTR	[ASCIZ .	MOVE	0,VAL
	JRA	IO,(IO)
.]
	MOVE	BP,PTSTOR
	TLZ	F,FNEVFL
	JRST	RESC

DFSTFN:	PUSHJ	P,GETARG
	PUSHJ	P,STEVAL
	JRST	FNCONT

GETARG:	PUTSTR	A
	PUTSTR	[ASCIZ .:	Z
.]
	SETZ	S1,
FNCTRY:	SKIPN	USRFNC(S1)
	JRST	FNCPLC
	CAMN	A,USRFNC(S1)
	JRST	ERRFDT
	AOJA	S1,FNCTRY
FNCPLC:	MOVEM	A,USRFNC(S1)
	SETZM	USRARG
	MOVE	[USRARG,,USRARG+1]
	BLT	USRARG+14
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .=.]
	POPJ	P,
	CAME	A,[ASCIZ .(.]
	JRST	ERRFMT
	MOVNI	S1,15
SETARG:	PUSHJ	P,SCAN
	CAIE	ST,$NUVAR
	CAIN	ST,$STVAR
	SKIPA
	JRST	ERRIFA
	PUTSTR	[ASCIZ .	MOVE	@.]
	MOVE	T1,S1
	ADDI	T1,15
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ .(IO)
	MOVEM	.]
	PUTSTR	A
	PUTSTR	[ASCIZ .%#
.]
	MOVEM	A,USRARG+15(S1)
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .).]
	JRST	GTARG2
	CAME	A,[ASCIZ .,.]
	JRST	ERRIFA
	AOJL	S1,SETARG
	JRST	ERRTLA

GTARG2:	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .=.]
	JRST	ERRFMT
	TLO	F,FNEVFL
	POPJ	P,

DIMEN:	PUSHJ	P,SCAN				;GET VARIABLE NAME
	JUMPL	ST,ERRDIM
	PUSHJ	P,PUTPER			;CHANGE IT
	PUSHJ	P,ADDSYM			;ADD IT TO TABLE
	PUTSTR	A				;AND WRITE IT IN THE FILE
	SETO	C,				;SET FLAG

PSUB:	SETZ	CH,
	PUSHJ	P,SCAN				;GET (
	PUSHJ	P,SCAN				;GET FIRST DIMENSION
	AOJ	A,
	SKIPN	C
	MOVEI	A,11				;= 0/10 IF IMPLIED
	MOVEM	A,DIM1				;AND PUT AWAY
RELOOK:	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ .,.]			;IS THIS 2-DIMENSIONAL?
	JRST	DUBL				;YES
	CAMN	A,[ASCIZ .(.]
	AOJ	CH,
	CAMN	A,[ASCIZ .).]			;TERMINATING )
	SOJ	CH,
	JUMPL	CH,OKPAR
	JUMPL	C,ERRDIM
	JUMPL	ST,ERRDIM
	JRST	RELOOK
OKPAR:	PUTSTR	[ASCIZ /:	BLOCK /]	;YES; WRITE DIM INTO FILE
	MOVE	T1,DIM1
	PUSHJ	P,DCASC1
TRYAGN:	PUTSTR	CRLF
	JUMPE	C,[MOVE	BP,PTSTOR
	JRST	RESC]
	PUSHJ	P,SCAN				;UNLESS DIM STATEMENT
	CAMN	A,[ASCIZ .\.]
	JRST	RESC
	JUMPG	ST,DIMEN			;IN WHICH CASE GOTO DIMEN
	JRST	ADDX

DUBL:	PUSHJ	P,SCAN				;GET OTHER DIMENSION
	PUTSTR	[ASCIZ/.:	/]		;ADD ANOTHER PERIOD AND
	MOVE	T1,DIM1
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	PUTSTR	[ASCIZ .	BLOCK .]		;NEXT, PUT DIMENSIONS
	MOVE	T1,DIM1
	PUSHJ	P,DCASC1
	PUTCHR	["*"]
	JUMPN	C,PTSA
	PUTSTR	[ASCIZ .00011.]			;DEFAULT = 0/10
	JRST	TRYAGN
PTSA:	MOVE	T1,A				;COULD BE MOVEI T1,1(A)
	AOJ	T1,				; BUT WOULD NOT SPOT DIM ERR
	PUSHJ	P,DCASC1
	PUSHJ	P,SCAN
	JRST	TRYAGN

GOTARR:	PUSHJ	P,PUTPER			;CHANGE SYMBOL'S NAME
GOTNAM:	PUSHJ	P,ADDSYM			;AND PUT IT INTO TABLE
	PUTSTR	A				;WRITE IT INTO FILE
	CAIL	ST,$NUARR
	JRST	IMPLY				;IF ARRAY, ADD DIMENSIONS
	PUTSTR	[ASCIZ .:Z
.]						;OTHERWISE, PUT IN ZERO
	JRST	RESC				;AND TRY FOR ANOTHER

IMPLY:	SETZ	C,
	MOVEM	BP,PTSTOR
	JRST	PSUB

ADDX:	TRNE	F,NOSORT
	JRST	NXTLIN
	ADDI	X,LINLEN			;POINT TO NEXT LINE
	CAMG	X,FINX
	JRST	WLP				;IF NOT DONE

ENDPS1:	SKIPN	FILCNT
	JRST	ENDPSB
	PUTSTR	[ASCIZ"IOADR:
"]
	MOVEI	T2,1
ENDPSA:	PUTCHR	["A"]
	MOVE	T1,T2
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ":	BLOCK 3
B"]
	MOVE	T1,T2
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ":	BLOCK 3
"]
	CAMGE	T2,FILCNT
	AOJA	T2,ENDPSA
ENDPSB:	TRNN	F,DATFLG
	JRST	FDAT1
	MOVE	CH,[POINT 7,PROG]		;STORE DATA FROM STATEMENTS
	TRNE	F,NOSORT
	MOVE	CH,[POINT 7,DATARE]
	PUTSTR	[ASCIZ/
DATA:/]
NLIN:	ILDB	S1,CH
	JUMPE	S1,FDAT
	PUTSTR	[ASCIZ/
ASCIZ←/]
	SKIPA
NLIN2:	ILDB	S1,CH
	JUMPN	S1,NEND
	PUTCHR	["←"]
	JRST	NLIN
NEND:	PUTCHR	S1
	JRST	NLIN2

FDAT:	PUTSTR	[ASCIZ/
	BLOCK 2
/]					;SIGNAL END OF DATA
FDAT1:	TRNN	F,LUPFLG
	JRST	NOLUEP
	PUTSTR	LOOPMC

NOLUEP:	PUTSTR	[ASCIZ/

PDL:	BLOCK 15

START:	MOVEI	GTSGTB
	GETSEG
	HALT
	MOVE	PP,[IOWD 15,PDL]
	PUSHJ	PP,INITIA
/]
	SKIPE	FILCNT
	PUTSTR	[ASCIZ"	MOVEI	IOADR
	MOVEM	IOWHER
"]
	TRNE	F,DATFLG
	PUTSTR	[ASCIZ .	MOVE	DBP,[POINT 7,DATA]
.]
	RELEAS	0,


	SUBTTL PASS 2					HOFFMAN/COURTNEY 4/74

	TRO	F,PASS2F
	IFE FTDEBUG,<MOVEI	TXTLIN+LINLEN-1
	CORE
	DIE	<CORE UUO FAILURE>>
	OPEN	0,OP3
	HALT
	JSP	JS,OPNA
	EXP IBUF
	MOVEI	S1,TMPNAM
	TRNE	F,NOSORT
	MOVEI	S1,SRCNAM
	HLLZS	1(S1)
	SETZM	2(S1)
	SETZM	3(S1)
	LOOKUP	0,(S1)
	DIE	<CANNOT FIND FOR PASS 2>
	SETZM	STRCT
	SETZM	LPCOUN
	MOVE	[IOWD 15,LPSTAK]
	MOVEM	LPPOIN

RLINE:	MOVE	BP,[POINT 7,TXTLIN]
RCHAR:	SOSGE	IBUF+2
	JRST	GETBFB
	ILDB	CH,IBUF+1
	JUMPE	CH,RCHAR
	IDPB	CH,BP
	CAIE	CH,LF
	JRST	RCHAR
	SETZB	0,NEWCT
	SETZM	CHRCT
	IDPB	BP
	MOVE	BP,[POINT 7,TXTLIN]
	MOVEM	P,PDLTMP

	TLO	F,WNUMFL
	PUSHJ	P,SCAN			;GET LINE NUMBER
	PUTCHR	["L"]			;WRITE OBJECT CODE: LABEL
	MOVE	T1,A
	MOVEM	T1,CURNUM
	PUSHJ	P,DCASC1
	MOVE	A,STRING
	PUTSTR	[ASCIZ/:;			/]
	PUTSTR	TXTLIN
NLNUM:	PUSHJ	P,SCAN			;GET NEXT ITEM FROM SOURCE CODE
	GOTO	TAB1			;BRANCH THROUGH TABLE#1

DLIMST:	CAMN	A,[ASCIZ .\.]
	JRST	RLINE
	CAMN	A,[ASCIZ .'.]
	JRST	RLINE
	JRST	ERRKNR

LETT:	PUSHJ	P,SCAN
	GOTO	TAB1A
VARP1:	MOVE	S2,A			;WE HAVE A VARIABLE; MOVE TO TMP
VARP1A:	PUSHJ	P,SCAN			;GET NEXT ITEM OF SOURCE CODE
	CAME	A,[ASCIZ/=/]			;IS IT "="?
	JRST	ERRKNR			;N - ERROR
	PUSHJ	P,EVAL			;Y- EXPRESSION MUST FOLLOW
LETCON:	PUTSTR	[ASCIZ	.	MOVEM	VAL,.]
	PUTSTR	S2
	TLZN	F,INXFLG
	JRST	NOTARY
	PUTSTR	[ASCIZ".(.X2)"]
NOTARY:	PUTSTR	CRLF
	PUSHJ	P,SCAN			;GET NEXT ITEM FROM SOURCE CODE
	GOTO	TABEND			;BRANCH

LETIND:	MOVE	S1,ST
	PUSH	P,A
	PUSHJ	P,INDEX
	POP	P,S2
	TLO	F,INXFLG
	CAIN	S1,$NUARR
	JRST	VARP1A
	SKIPA

STRP1:	MOVE	S2,A			;WE HAVE A STRING VARIABLE; MOVE TO TMP
	PUSHJ	P,SCAN			;GET NEXT ITEM FROM SOURCE CODE
	CAME	A,[ASCIZ/=/]			;IS IT "="?
	JRST	ERRKNR				;N- ERROR
	PUSHJ	P,STEVAL
	JRST	LETCON

GO2:	PUSHJ	P,SCAN			;WE HAVE A GO2; MUST BE FOLLOWED BY INTEGER
	CAIE	ST,$INTEG		;IS IT?
	JRST	ERRNIA				;N- ERROR
	PUTSTR	[ASCIZ/	JRST	L/]		;Y- WRITE OUTPUT CODE
EOGO2:	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	PUSHJ	P,SCAN			;GET NEXT ITEM OF SOURCE CODE
	GOTO	TABEND			;BRANCH
GOSUB:	PUSHJ	P,SCAN			;GOSUB
	CAIE	ST,$INTEG		;(SAME IDEA AS GO2)
	JRST	ERRNIA
	PUTSTR	[ASCIZ/	PUSHJ	PP,L/]
	JRST	EOGO2

RETUR:	PUTSTR	[ASCIZ/	POPJ	PP,
/]
	PUSHJ	P,SCAN
	GOTO	TABEND

STOP:	PUTSTR	[ASCIZ/	EXIT
/]
	PUSHJ	P,SCAN
	GOTO	TABEND
ON:	PUSHJ	P,EVALI			;EVALUATE EXPRESSION FOR RANGE COMPARISON
	PUTSTR	[ASCIZ/	JRST	.(VAL)
/]
	SETZ	S1,
REHOP:	PUSHJ	P,SCAN
	CAIE	ST,$GOTO
	CAIN	ST,$THEN
	JRST	HOP
	JUMPN	S1,ERRGTE
	CAME	A,[ASCIZ .,.]
	JRST	ERRGTE
	SETO	S1,
	JRST	REHOP
HOP:	PUSHJ	P,SCAN			;NEED INTEGER FOR DESTINATION ADDR.
	CAIE	ST,$INTEG		;HAVE ONE?
	JRST	ERRNIA			;N- ERROR
	PUTSTR	[ASCIZ/	JRST	L/]	;Y- WRITE OBJECT CODE
	MOVEI	T1,(A)
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	PUSHJ	P,SCAN			;GET NEXT ITEM
	CAMN	A,[ASCIZ/,/]		;MORE LINE NUMBERS?
	JRST	HOP			;Y- PROCESS THEM
	GOTO	TABEND
IF:	SETZ	S2,
	PUSHJ	P,SCAN
	GOTO	TAB3
IFEXP:	PUSHJ	P,STAKBK
	PUSHJ	P,EVAL			;EVALUATE FIRST EXPRESSION
	PUTSTR	[ASCIZ .	MOVE	BP,VAL
.]
	PUSHJ	P,RLCOMP
	PUSHJ	P,EVAL
	TRNE	F,IEQFLG
	MOVE	S1,[ASCIZ .N.]
	TRNE	F,IGTFLG
	MOVE	S1,[ASCIZ .GE.]
	TRNE	F,ILTFLG
	MOVE	S1,[ASCIZ .LE.]
	TRNE	F,IGTFLG
	TRNN	F,ILTFLG
	SKIPA
	MOVE	S1,[ASCIZ .E.]
	TRNE	F,IGTFLG
	TRNN	F,IEQFLG
	SKIPA
	MOVE	S1,[ASCIZ .G.]
	TRNE	F,ILTFLG
	TRNN	F,IEQFLG
	SKIPA
	MOVE	S1,[ASCIZ .L.]
	PUTSTR	[ASCIZ .	CAM.]
	PUTSTR	S1
	PUTSTR	[ASCIZ .	VAL,BP
.]
IFKWD:	PUSHJ	P,SCAN			;GET NEXT ITEM OF SOURCE CODE
	CAIE	ST,$GOTO
	CAIN	ST,$THEN
	JRST	GO2
	JUMPN	S2,ERRKNR
	CAMN	A,[ASCIZ .,.]
	SOJA	S2,IFKWD
	JRST	ERRKNR

IFSTR:	PUSHJ	P,STAKBK
	PUSHJ	P,STEVAL
	PUTSTR	[ASCIZ"	MOVE	BP,VAL
"]
	PUSHJ	P,RLCOMP
	PUSHJ	P,STEVAL
IFSTR2:	PUSHJ	P,SCAN			;GET NEXT ITEM OF SOURCE CODE
	CAIE	ST,$GOTO
	CAIN	ST,$THEN
	JRST	GOTOO1
	JUMPN	S2,ERRKNR
	CAME	A,[ASCIZ .,.]
	JRST	ERRKNR
	SOJA	S2,IFSTR2
GOTOO1:	PUSHJ	P,SCAN
	CAIE	ST,$INTEG
	JRST	ERRNIA
	MOVEM	A,SCSNUM
	PUTSTR	[ASCIZ .	PUSHJ	PP,IFSTR
.]
	TRZE	F,ILTFLG
	PUSHJ	P,SUCESS
	PUSHJ	P,FAIL
	TRZE	F,IGTFLG
	PUSHJ	P,SUCESS
	PUSHJ	P,FAIL
	TRZE	F,IEQFLG
	PUSHJ	P,SUCESS
	PUSHJ	P,FAIL
	PUTCHR	["I"]
	MOVE	T1,CURNUM
	PUSHJ	P,DCASC1
	PUTCHR	[":"]
	PUSHJ	P,SCAN
	GOTO	TABEND

SUCESS:	PUTSTR	[ASCIZ .	JRST	L.]
	MOVE	T1,SCSNUM
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	POP	P,T1
	JRST	1(T1)

FAIL:	PUTSTR	[ASCIZ .	JRST	I.]
	MOVE	T1,CURNUM
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	POPJ	P,

RLCOMP:	TRZ	F,ILTFLG!IGTFLG!IEQFLG
RLCOM1:	TRNE	F,IGTFLG
	TRNN	F,ILTFLG
	SKIPA
	POPJ	P,
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .=.]
	JRST	RLNTEQ
	TRO	F,IEQFLG
	POPJ	P,
RLNTEQ:	TRNE	F,IGTFLG
	JRST	STAKBK
	CAME	A,[ASCIZ .>.]
	JRST	RLNTGT
	TRO	F,IGTFLG
	JRST	RLCOM1
RLNTGT:	TRNE	F,IGTFLG!ILTFLG
	JRST	STAKBK			;PUSHJ P,STAKBK; POPJ P,
	CAME	A,[ASCIZ .<.]
	JRST	STAKBK
	TRO	F,ILTFLG
	JRST	RLCOM1

PRNT:	SETZ	S1,
	TRZ	F,GENFLG
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .#.]
	JRST	PRNXT1
	PUSHJ	P,EVALI
	PUTSTR	[ASCIZ"	ADD	IO,VAL
"]
	TRO	F,GENFLG
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .,.]
	CAMN	A,[ASCIZ .:.]
	JRST	PRNXT
	JUMPL	ST,PREN3
	SKIPA

PRNXT:	PUSHJ	P,SCAN
PRNXT1:	CAMN	A,[ASCIZ .TAB.]
	JRST	PRTAB
	GOTO	TAB4

PRDLIM:	CAMN	A,[ASCIZ .\.]
	JRST	PREN2
	CAMN	A,[ASCIZ .;.]
	JRST	PREND
	CAME	A,[ASCIZ .,.]
	JRST	PREVAL
	PUTSTR	[ASCIZ .	PUSHJ	PP,PRCOM
.]
	JRST	PREND

PRTAB:	PUSHJ	P,SCAN
	PUSHJ	P,EVALI
	PUSHJ	P,SCAN
	PUTSTR	[ASCIZ .	PUSHJ	PP,PRTAB
.]
	JRST	PREVA1

PREVAL:	CAIE	S1,$NUVAR
	CAIN	S1,$STVAR
	JRST	ERRMSD
	PUSHJ	P,STAKBK
	PUSHJ	P,EVAL
	PUTSTR	[ASCIZ %	PUSHJ	PP,TFLOT
%]
PREVA1:	MOVEI	S1,$NUVAR
	JRST	PRNXT

PRSTR:	MOVE	S1,ST
	PUSHJ	P,STAKBK
	PUSHJ	P,STEVAL
	PUTSTR	[ASCIZ %	PUSHJ	PP,PRSTR
%]
	JRST	PRNXT

PREND:	MOVE	S1,ST
	JRST	PRNXT

PREN2:	CAIE	S1,$DELIM
PREN3:	PUTSTR	[ASCIZ %	PUSHJ	PP,PCRLF
%]
	TRZE	F,GENFLG
	PUTSTR	[ASCIZ %	HRRZ	IO,RLC
%]
	GOTO	TABEND

FORLP:	PUSHJ	P,SCAN
	CAIE	ST,$NUVAR
	JRST	ERRILP
	MOVEM	A,VAR
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ/=/]
	JRST	ERRFMT
	PUTSTR	MOVEI.
	PUTSTR	[ASCIZ/.L,/]
	MOVE	T1,LPCOUN
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	PUSHJ	P,EVAL
	PUTSTR	MOVEM.
	PUTSTR	VALCOM
	PUTSTR	[ASCIZ/LP1(.L)
/]
	PUSHJ	P,SCAN
	CAIE	ST,$TO
	JRST	ERRFMT
	PUSHJ	P,EVAL
	PUTSTR	MOVEM.
	PUTSTR	VALCOM
	PUTSTR	[ASCIZ/LP2(.L)
/]
	PUSHJ	P,SCAN
	GOTO	TAB5

LPTHRD:	PUSHJ	P,EVAL
	PUTSTR	[ASCIZ"	MOVEM	VAL,LP3(.L)
"]
	PUSHJ	P,SCAN
	JRST	LPCONT

LPNTHR:	PUTSTR	[ASCIZ"	MOVE	[1.0]
	MOVEM	LP3(.L)
"]

LPCONT:	MOVE	S3,LPPOIN
	MOVE	S2,VAR
	HRR	S2,LPCOUN
	PUSH	S3,S2
	MOVEM	S3,LPPOIN
	PUTSTR	LOOP.
	PUTSTR	VAR
	PUTCHR	[","]
	MOVE	T1,LPCOUN
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	AOS	LPCOUN
	GOTO	TABEND

ENDLP:	PUSHJ	P,SCAN
	CAIE	ST,$NUVAR
	JRST	ERRFMT
	MOVE	S2,LPPOIN
	POP	S2,S3
	MOVEM	S2,LPPOIN
	HLLZM	S3,VAR
	HRRZS	S3
	CAME	A,VAR
	JRST	ERRINL
	PUTSTR	[ASCIZ/	EOLOOP	/]
	MOVE	T1,S3
	PUSHJ	P,DCASC1
	PUTSTR	CRLF
	PUSHJ	P,SCAN
	GOTO	TABEND

STRAN:	PUTSTR	[ASCIZ"	MSTIME	.T1,
	JSA	IO,SETRAN##
	JUMP	.T1
"]
;	PUSHJ	P,SCAN
;	GOTO	TABEND
	JRST	ELOGLN

REED:	TRNE	F,DATFLG
	JRST	YESDAT
	PUTSTR	[ASCIZ .	JRST	[OUTSTR	[ASCIZ+
OUT OF DATA
+]
	EXIT]
.]
	JRST	RLINE
YESDAT:	TRO	F,READFL
	JRST	INPT2

INPT:	TRZ	F,READFL!GENFLG
	PUTSTR	[ASCIZ"	PUSH	PP,DBP
"]
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .#.]
	JRST	NOTINF
	PUSHJ	P,EVALI
	PUTSTR	[ASCIZ"	ADDI	IO,(RLC)
	MOVEI	ERRRD
	MOVEM	RESTRT
"]
	TRO	F,GENFLG
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .,.]
	CAMN	A,[ASCIZ .:.]
	JRST	INPOK
	JRST	ERRFMT

NOTINF:	PUTSTR	[ASCIZ"	MOVEI	.+2
	MOVEM	RESTRT
"]
	PUSHJ	P,STAKBK
INPOK:	PUTSTR	[ASCIZ"	SETZM	INPFLG
"]
	JRST	INPT2

NXTVAR:	PUSHJ	P,SCAN
	JUMPL	ST,INPDON
	CAME	A,[ASCIZ .,.]
	JRST	ERRFMT
INPT2:	PUSHJ	P,SCAN
	MOVEM	ST,ISTATE
	TRNN	F,READFL
	PUTSTR	[ASCIZ .	PUSHJ	PP,INPTB
.]
	TRNE	F,READFL
	PUTSTR	[ASCIZ .	PUSHJ	PP,SCANB
.]
	GOTO	TAB6

INNUM:	PUTSTR	[ASCIZ .	CAIE	ST,3
.]
	TRNE	F,READFL!GENFLG
	PUTSTR	[ASCIZ .	JRST	ERRRD
.]
	TRNN	F,READFL!GENFLG
	PUTSTR	[ASCIZ .	PUSHJ	PP,ERRNCF
.]
	PUTSTR	MOVEM.
	PUTSTR	[ASCIZ".T4,"]
INSCNT:	PUTSTR	A
	PUTSTR	CRLF
	JRST	NXTVAR

INSTR:	PUTSTR	[ASCIZ .	PUSHJ	PP,INSUB
	MOVEM	BP,.]
	JRST	INSCNT

INSTAR:	PUTSTR	[ASCIZ .	PUSHJ	PP,INSUB
	MOVEM	BP,.]
	JRST	INCONT

INARR:	PUSH	P,A
	PUSHJ	P,INDEX
	POP	P,A
	MOVE	ISTATE
	CAIE	$NUARR
	JRST	INSTAR
	PUTSTR	[ASCIZ .	CAIE	ST,3
.]
	TRNN	F,READFL
	JRST	NOTRD2
	PUTSTR	[ASCIZ .	JRST	ERRRD
.]
	SKIPA
NOTRD2:	PUTSTR	[ASCIZ .	PUSHJ	PP,ERRNCF
.]
	PUTSTR	MOVEM.
	PUTSTR	[ASCIZ".T4,"]
INCONT:	PUTSTR	A
	PUTSTR	[ASCIZ ".(.X2)
"]
	JRST	NXTVAR

INPDON:	TRNE	F,READFL
	JRST	INPEND
	PUTSTR	[ASCIZ .	POP	PP,DBP
.]
INPEND:	TRNE	F,GENFLG
	PUTSTR	[ASCIZ %	HRRZ	IO,RLC
%]
	GOTO	TABEND		;COULD BE JRST RLINE

RESTOR:	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .#.]
	CAIN	ST,$INTEG
	JRST	RSTFIL
	TRNN	F,DATFLG
	JRST	ERRNDT
	PUTSTR	[ASCIZ .	MOVE	DBP,[POINT 7,DATA]
.]
	GOTO	TABEND

SCRFIL:	PUSHJ	P,SCAN
	TROA	F,GENFLG

RSTFIL:	TRZ	F,GENFLG
RSTFI1:	CAIE	ST,$INTEG
	PUSHJ	P,SCAN
	CAIE	ST,$INTEG
	JRST	ERRFMT
	PUTSTR	[ASCIZ"	OPEN	"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ",O"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ"
	JRST	[OUTSTR	[ASCIZ .?CANNOT INIT DEVICE
.]
	EXIT]
	HLLZS	C"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ"+1
	SETZM	C"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ"+2
	"]
	TRNE	F,GENFLG
	PUTSTR	[ASCIZ"ENTER	"]
	TRNN	F,GENFLG
	PUTSTR	[ASCIZ"LOOKUP	"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ",C"]
	MOVE	T1,A
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ"
	JRST	[OUTSTR	[ASCIZ .?CANNOT "]
	TRNE	F,GENFLG
	PUTSTR	[ASCIZ"ENTER"]
	TRNN	F,GENFLG
	PUTSTR	[ASCIZ"FIND"]
	PUTSTR	[ASCIZ" FILE
.]
	EXIT]
"]
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ .,.]
	CAMN	A,[ASCIZ .;.]
	SKIPA
	GOTO	TABEND
	PUSHJ	P,SCAN
	JRST	RSTFI1

CHGSTR:	PUSHJ	P,SCAN
	GOTO	TAB8

CNVR:	PUTSTR	[ASCIZ"	FIX	.T4,"]
	PUTSTR	A
	PUTSTR	[ASCIZ".
"]
	PUTSTR	CHGTXT
	PUTSTR	A
	PUTSTR	[ASCIZ".(.X)
	FIX	0,.T3
	IDPB	.T1
	AOJ	.X,
	SOJG	.T4,.-5
	SETZ	.X,
	IDPB	.X,.T1
"]
	PUSHJ	P,SCAN
	CAIE	ST,$TO
	JRST	ERRFMT
	PUSHJ	P,SCAN
	CAIE	ST,$STVAR
	JRST	ERRFMT
	PUTSTR	[ASCIZ"	MOVEM	.T2,"]
	PUTSTR	A
	PUTSTR	CRLF
	PUSHJ	P,SCAN
	GOTO	TABEND

CSTR:	PUSHJ	P,STAKBK
	PUSHJ	P,STEVAL
	PUSHJ	P,SCAN
	CAIE	ST,$TO
	JRST	ERRFMT
	PUSHJ	P,SCAN
	CAIE	ST,$NUVAR
	JRST	ERRFMT
	PUTSTR	[ASCIZ"	HRLI	VAL,↑O440700
	SETZ	.X,
	ILDB	.T3,VAL
	JUMPE	.T3,.+4
	FSC	.T3,↑O233
	MOVEM	.T3,"]
	PUTSTR	A
	PUTSTR	[ASCIZ".+1(.X)
	AOJA	.X,.-4
	FSC	.X,↑O233
	MOVEM	.X,"]
	PUTSTR	A
	PUTSTR	[ASCIZ".
"]
	PUSHJ	P,SCAN
	GOTO	TABEND

LNCONT:	CAME	A,[ASCIZ .\.]
	JRST	ERREND
	JRST	NLNUM

ELOGLN:	MOVEI	T1,ADDX
	MOVEI	T2,RESC
	TRNN	F,PASS2F
	JRST	ELOGL1
	MOVEI	T1,RLINE
	MOVEI	T2,NLNUM
ELOGL1:	PUSHJ	P,SCAN
	JUMPL	ST,(T1)
	CAMN	A,[ASCIZ .\.]
	JRST	(T2)
	JRST	ELOGL1

INDEX:	PUSHJ	P,SCAN
	PUSHJ	P,EVALI
	PUTSTR	MOVE.
	PUTSTR	[ASCIZ".X2,VAL
"]
	PUSHJ	P,SCAN
	CAMN	A,[ASCIZ/)/]
	POPJ	P,
	CAME	A,[ASCIZ .,.]
	JRST	ERRIVS
	PUTSTR	[ASCIZ"	PUSH	PP,.X2
"]
	PUSHJ	P,EVALI
	PUTSTR	[ASCIZ"	POP	PP,.X2
	IMUL	VAL,"]
	MOVE	T2,-1(P)
	MOVE	Z,[POINT 7,T2]
	ILDB	Z
	JUMPN	.-1
	MOVEI	"."
	DPB	Z
	MOVEM	T2,-1(P)
	PUTSTR	T2
	PUTSTR	[ASCIZ".
	ADD	.X2,VAL
	AOJ	.X2,
"]
	PUSHJ	P,SCAN
	CAME	A,[ASCIZ/)/]
	JRST	ERRIVS
	POPJ	P,

ERROUT:	OUTSTR	TXTLIN
	PUSHJ	P,ERRDPL
	MOVE	P,PDLTMP
	TRNN	F,PASS2F
	JRST	ADDX
	JRST	RLINE

ERRDPL:	SKIPG	C,CHRCT
	JRST	ERRARO
	OUTCHR	[" "]
	SOJG	C,.-1
ERRARO:	OUTSTR	[ASCIZ"↑
"]
	OUTCHR	["?"]
	TLNN	F,TTYFLG
	OUTSTR	(T1)
	PUTCHR	[";"]
	PUTSTR	(T1)
	PUTSTR	CRLF
	OUTSTR	[ASCIZ/ IN LINE /]
	MOVE	T1,CURNUM
	PUSHJ	P,DASCOU
	OUTSTR	CRLF
	AOS	ERRCNT
	POPJ	P,


	SUBTTL	END OF SOURCE / CALL MACRO		HOFFMAN 5/74

EOFB:	PUTSTR	[ASCIZ/
EXIT.::	EXIT

/]
	SKIPN	T1,LPCOUN
	JRST	ENDSRC
	PUTSTR	[ASCIZ/LP1:	BLOCK /]
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ/
LP2:	BLOCK /]
	MOVE	T1,LPCOUN
	PUSHJ	P,DCASC1
	PUTSTR	[ASCIZ/
LP3:	BLOCK /]
	MOVE	T1,LPCOUN
	PUSHJ	P,DCASC1
ENDSRC:	PUTSTR	[ASCIZ/

	END	START
/]

	SETZM	TMPNAM
	TRNN	F,NOSORT
	RENAME	TMPNAM
	JFCL
	RELEAS	0,
	RELEAS	1,
	SKIPE	ERRCNT
	JRST	ERHNDL
	MOVE	T1,OBJDEV
	DEVCHR	T1,
	SETCA	T1,
	TDNE	T1,[2,,↑O10000]
	JRST	RERUN
	MOVE	BP,MCBFPT
	MOVNI	10
	ADDM	IWD
	SIXMOV	OBJDEV
	MOVEI	":"
	IDPB	BP
	SIXMOV	OBJNAM
	SKIPN	LSTDEV
	JRST	NOLSTT
	MOVEI	","
	IDPB	BP
	SIXMOV	LSTDEV
	SIXMOV	LSTNAM
	MOVEI	"."
	IDPB	BP
	SIXMOV	LSTNAM+1
NOLSTT:	MOVEI	"="
	IDPB	BP
	SIXMOV	OBJDEV
	MOVEI	":"
	IDPB	BP
	SIXMOV	OBJNAM
	MOVEI	"."
	IDPB	BP
	HLLZ	OBJNAM+1
	SIXMOV
	MOVEI	S2,CR
	IDPB	S2,BP
	MOVEI	S2,LF
	IDPB	S2,BP
	MOVEM	BP,MCBFPT
	TRNN	F,CCLENT
	JRST	RERUN

EOJA:	MOVE	BP,MCBFPT
	CAME	BP,[POINT 7,MACBUF]
	JRST	NOERRS
	TRNN	F,CCLENT
	EXIT
	JRST	ERRIF1
NOERRS:	TRNN	F,EOJFLG
	JRST	NOLOAD
	REMAC LOADER
	JRST	CCLADD
NOLOAD:	TRNN	F,CCLENT
	JRST	PASTBS
	REMAC BAS10
CCLADD:	MOVNI	2
	ADDM	IWD
PASTBS:	MOVE	[3,,MACTMP]
	HRLZ	Z,IWD
	HRRI	Z,MACBUF-1
	MOVEM	Z,IWD
	TMPCOR
	SKIPA
	JRST	OK2
	MOVSI	S1,(SIXBIT .MAC.)
	MOVEM	S1,TM1
	HLLZ	S1,TMPNAM
	HLLM	S1,TM1
	MOVSI	S1,(SIXBIT .TMP.)
	MOVEM	S1,TM1+1
	SETZM	TM1+2
	SETZM	TM1+3
	OPEN	0,OP17
	HALT
	ENTER	0,TM1
	DIE	<CANNOT ENTER MACTMP>
	OUT	0,IWD
	SKIPA
	DIE	<MACTMP OUTPUT ERROR>

OK2:	MOVE	[1,,RUNBLK]
	RUN
	HALT

ERHNDL:	OUTCHR	["?"]
	MOVE	T1,ERRCNT
	PUSHJ	P,DASCOU
	OUTSTR	[ASCIZ . ERRORS DETECTED
.]
	JRST	RERUN

GETBFB:	IN	0,
	JRST	RCHAR
	JRST	EOFB
GETBFA:	IN	0,				;SUBROUTINE TO INPUT
	JRST	LINELP				;A BUFFER FROM THE SOURCE
	TRNN	F,NOSORT
	JRST	EOFA
	JRST	ENDPS1

PUTBUF:	OUT	0,				;TO OUTPUT BUFFER TO TEMP
	JRST	PLCH
	DIE	<OUTPUT ERROR ON TMPFIL>


	SUBTTL	COMMAND SCANNER				HOFFMAN 11/72

	EXTN=FILNAM+1
	PPN=FILNAM+3

ZERSUB:	MOVE	Z,[POINT 6,S3]
	SETZB	T1,S3
	POPJ	P,

COMSUB:	CAIN	"!"
	JRST	[MOVEI	T2,RUNIT
	JRST	(S1)]
	CAIE	CR
	CAIN	","
	JRST	[MOVEI	T2,EOJF
	JRST	(S1)]
	CAIE	"="
	CAIN	"←"
	JRST	[MOVEI	T2,EOJF
	JRST	(S1)]
	CAIN	ALT
	JRST	[MOVEI	T2,EOJF
	JRST	(S1)]
	CAIN	"["
	JRST	[MOVEI	T2,GTPROJ
	JRST	(S1)]
	CAIE	"."
	JRST	2(S1)
	MOVEI	T2,GTEXT
	JRST	(S1)

FSUB:	JSP	S1,COMSUB
	MOVEM	S3,FILNAM
	JRST	(T2)
	CAIL	T1,6
	JRST	.+3
	SUBI	↑O40
	IDPB	Z
	AOJA	T1,(S2)

FILBRK:	SETZM	DEV
	MOVEI	S2,1
	MOVEM	S2,EXTN
	PUSHJ	P,ZERSUB
	MOVEI	S2,.+1
	PUSHJ	P,GTCMCH
	JUMPE	EOJA
	CAIE	":"
	JRST	FSUB
	MOVEM	S3,DEV
	PUSHJ	P,ZERSUB
	MOVEI	S2,.+1
	PUSHJ	P,GTCMCH
	JRST	FSUB
GTEXT:	PUSHJ	P,ZERSUB
	PUSHJ	P,GTCMCH
	JSP	S1,COMSUB
	MOVEM	S3,EXTN
	JRST	(T2)
	CAIL	T1,3
	JRST	.+3
	SUBI	↑O40
	IDPB	Z
	AOJA	T1,GTEXT+1

GTPROJ:	SETZB	T1,T2
	PUSHJ	P,GTCMCH
	CAIN	","
	JRST	GTPROG
	SUBI	"0"
	CAILE	7
	JRST	ERRIFS
	ASH	T2,3
	JOV	ERRIFS
	HRLZS
	ADD	T2,
	JOV	ERRIFS
	JRST	GTPROJ+1

GTPROG:	PUSHJ	P,GTCMCH
	CAIE	CR
	CAIN	"]"
	JRST	COMBIN
	SUBI	"0"
	CAILE	7
	JRST	ERRIFS
	ASH	T1,3
	JOV	ERRIFS
	HRLZS
	ADD	T1,
	JOV	ERRIFS
	JRST	GTPROG
COMBIN:	HLR	T2,T1
	MOVEM	T2,PPN
	POPJ	P,
EOJF:	REPEAT 4,<IBP	CH>
	SOJ	CH,
	POPJ	P,

GTCMCH:	ILDB	CH
	CAIN	" "
	JRST	GTCMCH
	CAIE	"/"
	POPJ	P,
	ILDB	CH
	CAIE	"N"
	JRST	ERRBDS
	TRO	F,NOSORT
	JRST	GTCMCH

ERRBDS:	OUTSTR	[ASCIZ .?UNRECOGNIZABLE SWITCH ".]
	OUTCHR
	OUTSTR	[ASCIZ ."
.]
	TRNE	F,CCLENT
	JRST	ERRIF1
	CLRBFI
	EXIT

ERRIFS:	OUTSTR	[ASCIZ/?IMPROPER FILE SPEC
/]
ERRIF1:	MOVE	[SIXBIT .BAS10.]
	MOVEM	FILNAM

RUNIT:	MOVSI	(SIXBIT .SYS.)
	MOVEM	RBLOCK
	MOVE	FILNAM
	CAMN	[SIXBIT .LOADER.]
	TRNE	F,CCLENT
	JRST	DORUN
	TRO	F,EOJFLG
	JRST	EOJA
DORUN:	MOVEM	RBLOCK+1
	MOVE	[1,,RBLOCK]
	RUN
	HALT


	SUBTTL	SUBROUTINES				HOFFMAN 5/74

OPNA:	MOVE	[↑O400000,,BUFA1+1]
	SKIPA

OPNB:	MOVE	[↑O400000,,BUFB1+1]
	MOVE	S1,(JS)
	MOVEM	(S1)
	MOVE	[POINT 7,0,35]
	MOVEM	1(S1)
	JRST	1(JS)

PUTPER:	MOVE	S1,[POINT 7,A]		;TO CHANGE VARIABLE NAME
SLP:	ILDB	S2,S1
	JUMPN	S2,SLP
	MOVEI	S2,"."
	DPB	S2,S1
	POPJ	P,

ADDSYM:	SETZ	S1,			;TO ADD TO VARS LIST
	POP	P,Z
VARLP:	SKIPN	VARS(S1)
	JRST	EOVARS
	CAMN	A,VARS(S1)
	JRST	RESC
	AOJA	S1,VARLP
EOVARS:	MOVEM	A,VARS(S1)
	JRST	(Z)

FNF:	OUTCHR	["?"]
	OUTSTR	ASCNAM
	OUTCHR	["."]
	MOVE	BP,[POINT 6,SRCNAM+1]
	MOVEI	C,3
FLP:	ILDB	BP
	JUMPE	EOLOOP
	ADDI	↑O40
	OUTCHR
EOLOOP:	SOJG	C,FLP
	OUTSTR	[ASCIZ/ NOT FOUND
/]
	SETZM	SRCNAM
	MOVE	[SRCNAM,,SRCNAM+1]
	BLT	LSTNAM+3
	JRST	RERUN

SIXADD:	MOVE	S1,(JS)
	MOVEI	C,6
SIXLUP:	ILDB	S2,S1
	JUMPE	S2,1(JS)
	ADDI	S2,↑O40
	IDPB	S2,BP
	SOJG	C,SIXLUP
	JRST	1(JS)

STAKBK:	MOVE	BP,OLDPT
	MOVE	OLDCT
	EXCH	CHRCT
	MOVEM	NEWCT
	POPJ	P,

SIXOUT:	PUTSTR	[ASCIZ"	SIXBIT/"]
	MOVE	T2,[POINT 6,T1]
	MOVEI	C,6
SIXOU1:	ILDB	A,T2
	JUMPE	A,SIXOU2
	ADDI	A,↑O40
	PUTCHR	A
	SOJG	C,SIXOU1
SIXOU2:	PUTSTR	[ASCIZ"/
"]
	POPJ	P,

DASCOU:	PUSH	P,C
	SETZ	C,
DVLOOP:	IDIVI	T1,10
	ADDI	T2,"0"
	PUSH	P,T2
	AOJ	C,
	JUMPG	T1,DVLOOP
SPOP:	POP	P,T1
	OUTCHR	T1
	SOJG	C,SPOP
	POP	P,C
	POPJ	P,

DECASC:	MOVE	T1,STRCT
DCASC1:	PUSH	P,C
	PUSH	P,T2
	MOVEI	C,5
DIVIDE:	IDIVI	T1,10
	ADDI	T2,"0"
	PUSH	P,T2
	SOJG	C,DIVIDE
	MOVEI	C,5
STKPOP:	POP	P,T1
	PUTCHR	T1
	SOJG	C,STKPOP
	POP	P,T2
	POP	P,C
	POPJ	P,

	SUBTTL	UUO DISPATCH ROUTINES & LUUOS		HOFFMAN 7/74

	RADIX 8
UUODIS:	LDB	[POINT 9,40,8]
	CAIN	1
	JRST	PUTC
	CAIN	2
	JRST	PUTS
	CAIN	3
	JRST	TRANSF
	CAIN	4
	JRST	FIXIT
	CAIN	5
	JRST	FLOTIT
	CAIN	6
	JRST	OCTOU1
	CAIN	7
	JRST	OCTOU2
	OUTSTR	[ASCIZ .% UUO ERROR
.]
	EXIT

PUTS:	HRRZ	Z,40
	OR	Z,[POINT 7,0]
GLP:	ILDB	Z
	SKIPN	0
	POPJ	P,
	PUSHJ	P,PUTC1
	JRST	GLP

PUTC:	HRRZ	@40
PUTC1:	SOSG	OBUF+2
	JRST	PUTB
PUTC2:	IDPB	OBUF+1
	POPJ	P,

PUTB:	OUT	1,				;OUTPUTS TO OBJECT
	JRST	PUTC2
	OUTSTR	[ASCIZ .OBJECT OUTPUT ERROR.]
	EXIT

TRANSF:	HRRZ	Z,40			;TRANSFER ROUTINE FOR TABLE LOOKUP
	POP	P,			;JUNK
TRLOOP:	HLRE	0,(Z)	
	JUMPE	0,TRDISP
	CAMN	0,ST
	JRST	TRDISP
	AOJA	Z,TRLOOP
TRDISP:	HRRZ	Z,(Z)
	JRST	(Z)

FIXIT:	MOVE	0,@40
	MULI	0,400
	EXCH	0,Z
	JUMPGE	Z,FIXIT1
	TRC	Z,-1
	MOVNS	0
FIXIT1:	ASH	0,-243(Z)
	SKIPGE	Z
	MOVNS	0
	JRST	RETARG

FLOTIT:	MOVE	0,@40
	HLRE	Z,0
	HLL	0,Z
	FSC	0,233
	SKIPGE	0
	AOJE	Z,FLOTI1
	FSC	Z,255
	FADR	0,Z
FLOTI1:	;JRST	RETARG

RETARG:	LDB	Z,[POINT 4,40,12]
	MOVEM	0,(Z)
	POPJ	P,

OCTOU1:	SKIPA	Z,[POINT 3,@40]
OCTOU2:	MOVE	Z,[POINT 3,@40,17]
	PUSH	P,T1
	MOVEI	T1,6
OCTBOT:	ILDB	0,Z
	ADDI	0,"0"
	PUSHJ	P,PUTC1
	SOJG	T1,OCTBOT
	POP	P,T1
	POPJ	P,

	END BAS10